| | package codex |
| |
|
| | import ( |
| | "encoding/base64" |
| | "encoding/json" |
| | "fmt" |
| | "strings" |
| | "time" |
| | ) |
| |
|
| | |
| | |
| | |
| | type JWTClaims struct { |
| | AtHash string `json:"at_hash"` |
| | Aud []string `json:"aud"` |
| | AuthProvider string `json:"auth_provider"` |
| | AuthTime int `json:"auth_time"` |
| | Email string `json:"email"` |
| | EmailVerified bool `json:"email_verified"` |
| | Exp int `json:"exp"` |
| | CodexAuthInfo CodexAuthInfo `json:"https://api.openai.com/auth"` |
| | Iat int `json:"iat"` |
| | Iss string `json:"iss"` |
| | Jti string `json:"jti"` |
| | Rat int `json:"rat"` |
| | Sid string `json:"sid"` |
| | Sub string `json:"sub"` |
| | } |
| |
|
| | |
| | |
| | type Organizations struct { |
| | ID string `json:"id"` |
| | IsDefault bool `json:"is_default"` |
| | Role string `json:"role"` |
| | Title string `json:"title"` |
| | } |
| |
|
| | |
| | |
| | type CodexAuthInfo struct { |
| | ChatgptAccountID string `json:"chatgpt_account_id"` |
| | ChatgptPlanType string `json:"chatgpt_plan_type"` |
| | ChatgptSubscriptionActiveStart any `json:"chatgpt_subscription_active_start"` |
| | ChatgptSubscriptionActiveUntil any `json:"chatgpt_subscription_active_until"` |
| | ChatgptSubscriptionLastChecked time.Time `json:"chatgpt_subscription_last_checked"` |
| | ChatgptUserID string `json:"chatgpt_user_id"` |
| | Groups []any `json:"groups"` |
| | Organizations []Organizations `json:"organizations"` |
| | UserID string `json:"user_id"` |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | func ParseJWTToken(token string) (*JWTClaims, error) { |
| | parts := strings.Split(token, ".") |
| | if len(parts) != 3 { |
| | return nil, fmt.Errorf("invalid JWT token format: expected 3 parts, got %d", len(parts)) |
| | } |
| |
|
| | |
| | claimsData, err := base64URLDecode(parts[1]) |
| | if err != nil { |
| | return nil, fmt.Errorf("failed to decode JWT claims: %w", err) |
| | } |
| |
|
| | var claims JWTClaims |
| | if err = json.Unmarshal(claimsData, &claims); err != nil { |
| | return nil, fmt.Errorf("failed to unmarshal JWT claims: %w", err) |
| | } |
| |
|
| | return &claims, nil |
| | } |
| |
|
| | |
| | |
| | |
| | func base64URLDecode(data string) ([]byte, error) { |
| | |
| | switch len(data) % 4 { |
| | case 2: |
| | data += "==" |
| | case 3: |
| | data += "=" |
| | } |
| |
|
| | return base64.URLEncoding.DecodeString(data) |
| | } |
| |
|
| | |
| | func (c *JWTClaims) GetUserEmail() string { |
| | return c.Email |
| | } |
| |
|
| | |
| | |
| | func (c *JWTClaims) GetAccountID() string { |
| | return c.CodexAuthInfo.ChatgptAccountID |
| | } |
| |
|