Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.
 
 
 

59 рядки
1.8 KiB

  1. package common
  2. import (
  3. "errors"
  4. "strings"
  5. )
  6. type CodexCredentialMode string
  7. const (
  8. CodexCredentialModeAPIKey CodexCredentialMode = "api_key"
  9. CodexCredentialModeOAuth CodexCredentialMode = "oauth"
  10. )
  11. var (
  12. ErrCodexOAuthCredentialRequired = errors.New("codex channel: oauth credential required")
  13. ErrCodexOAuthCredentialInvalidJSON = errors.New("codex channel: invalid oauth key json")
  14. ErrCodexOAuthAccessTokenRequired = errors.New("codex channel: access_token is required")
  15. ErrCodexOAuthAccountIDRequired = errors.New("codex channel: account_id is required")
  16. )
  17. type CodexOAuthCredential struct {
  18. IDToken string `json:"id_token,omitempty"`
  19. AccessToken string `json:"access_token,omitempty"`
  20. RefreshToken string `json:"refresh_token,omitempty"`
  21. AccountID string `json:"account_id,omitempty"`
  22. LastRefresh string `json:"last_refresh,omitempty"`
  23. Email string `json:"email,omitempty"`
  24. Type string `json:"type,omitempty"`
  25. Expired string `json:"expired,omitempty"`
  26. }
  27. func ParseCodexOAuthCredential(raw string) (*CodexOAuthCredential, error) {
  28. trimmed := strings.TrimSpace(raw)
  29. if trimmed == "" || !strings.HasPrefix(trimmed, "{") {
  30. return nil, ErrCodexOAuthCredentialRequired
  31. }
  32. var credential CodexOAuthCredential
  33. if err := Unmarshal([]byte(trimmed), &credential); err != nil {
  34. return nil, ErrCodexOAuthCredentialInvalidJSON
  35. }
  36. if strings.TrimSpace(credential.AccessToken) == "" {
  37. return nil, ErrCodexOAuthAccessTokenRequired
  38. }
  39. if strings.TrimSpace(credential.AccountID) == "" {
  40. return nil, ErrCodexOAuthAccountIDRequired
  41. }
  42. return &credential, nil
  43. }
  44. func DetectCodexCredentialMode(raw string) CodexCredentialMode {
  45. if _, err := ParseCodexOAuthCredential(raw); err == nil {
  46. return CodexCredentialModeOAuth
  47. }
  48. return CodexCredentialModeAPIKey
  49. }