| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| package authresolver |
|
|
| import ( |
| "aurora/internal/accounts" |
| "errors" |
| "os" |
| "strings" |
|
|
| "github.com/gin-gonic/gin" |
| "github.com/google/uuid" |
| ) |
|
|
| |
| type AccessTokenResolver struct { |
| |
| CustomerKey string |
| } |
|
|
| func New() *AccessTokenResolver { |
| return &AccessTokenResolver{ |
| CustomerKey: os.Getenv("Authorization"), |
| } |
| } |
|
|
| |
| |
| |
| |
| |
| |
| func (r *AccessTokenResolver) ResolveAccessToken(c *gin.Context) (token string, isCustomerKey bool, err error) { |
| authHeader := c.GetHeader("Authorization") |
| token, _ = splitAuthHeader(authHeader) |
|
|
| if token != "" && r.CustomerKey != "" && token == r.CustomerKey { |
| |
| return "", true, nil |
| } |
| return token, false, nil |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| func (r *AccessTokenResolver) ResolveAccount(c *gin.Context) (*accounts.Account, error) { |
| token, isCustomerKey, err := r.ResolveAccessToken(c) |
| if err != nil { |
| return nil, err |
| } |
| if isCustomerKey || token == "" { |
| return nil, nil |
| } |
|
|
| |
| if isValidUUID(token) { |
| acct := accounts.NewAccount(uuid.NewString(), accounts.TypeNoAuth, token) |
| return acct, nil |
| } |
|
|
| |
| acct := accounts.NewAccount(uuid.NewString(), accounts.TypeFree, token) |
| return acct, nil |
| } |
|
|
| func splitAuthHeader(authHeader string) (string, string) { |
| payload := strings.TrimSpace(authHeader) |
| if len(payload) >= len("Bearer ") && strings.EqualFold(payload[:len("Bearer ")], "Bearer ") { |
| payload = strings.TrimSpace(payload[len("Bearer "):]) |
| } |
| parts := strings.SplitN(payload, ",", 2) |
| token := strings.TrimSpace(parts[0]) |
| if len(parts) == 1 { |
| return token, "" |
| } |
| return token, strings.TrimSpace(parts[1]) |
| } |
|
|
| func isValidUUID(s string) bool { |
| _, err := uuid.Parse(s) |
| return err == nil |
| } |
|
|
| |
| var ErrNoToken = errors.New("no token in request") |
|
|