fix: P1-02 OAuth context propagation and P1-16 AuthProvider double-check
P1-02: OAuth ExchangeCode and GetUserInfo now accept context parameter
to properly propagate request context to HTTP calls
P1-16: AuthProvider isAuthenticated now uses single source of truth
(effectiveUser !== null) instead of double-checking both
React state and module-level function
This commit is contained in:
@@ -63,10 +63,10 @@ type OAuthManager interface {
|
||||
GetAuthURL(provider OAuthProvider, state string) (string, error)
|
||||
|
||||
// ExchangeCode 换取访问令牌
|
||||
ExchangeCode(provider OAuthProvider, code string) (*OAuthToken, error)
|
||||
ExchangeCode(ctx context.Context, provider OAuthProvider, code string) (*OAuthToken, error)
|
||||
|
||||
// GetUserInfo 获取用户信息
|
||||
GetUserInfo(provider OAuthProvider, token *OAuthToken) (*OAuthUser, error)
|
||||
GetUserInfo(ctx context.Context, provider OAuthProvider, token *OAuthToken) (*OAuthUser, error)
|
||||
|
||||
// ValidateToken 验证令牌
|
||||
ValidateToken(token string) (bool, error)
|
||||
@@ -203,14 +203,12 @@ func (m *DefaultOAuthManager) GetAuthURL(provider OAuthProvider, state string) (
|
||||
}
|
||||
|
||||
// ExchangeCode 换取访问令牌(使用真实 provider 实现)
|
||||
func (m *DefaultOAuthManager) ExchangeCode(provider OAuthProvider, code string) (*OAuthToken, error) {
|
||||
func (m *DefaultOAuthManager) ExchangeCode(ctx context.Context, provider OAuthProvider, code string) (*OAuthToken, error) {
|
||||
entry, ok := m.entries[provider]
|
||||
if !ok {
|
||||
return nil, ErrOAuthProviderNotSupported
|
||||
}
|
||||
|
||||
ctx := context.Background()
|
||||
|
||||
switch provider {
|
||||
case OAuthProviderGoogle:
|
||||
if entry.google != nil {
|
||||
@@ -302,14 +300,12 @@ func (m *DefaultOAuthManager) ExchangeCode(provider OAuthProvider, code string)
|
||||
}
|
||||
|
||||
// GetUserInfo 获取用户信息(使用真实 provider 实现)
|
||||
func (m *DefaultOAuthManager) GetUserInfo(provider OAuthProvider, token *OAuthToken) (*OAuthUser, error) {
|
||||
func (m *DefaultOAuthManager) GetUserInfo(ctx context.Context, provider OAuthProvider, token *OAuthToken) (*OAuthUser, error) {
|
||||
entry, ok := m.entries[provider]
|
||||
if !ok {
|
||||
return nil, ErrOAuthProviderNotSupported
|
||||
}
|
||||
|
||||
ctx := context.Background()
|
||||
|
||||
switch provider {
|
||||
case OAuthProviderGoogle:
|
||||
if entry.google != nil {
|
||||
@@ -448,8 +444,9 @@ func (m *DefaultOAuthManager) ValidateToken(token string) (bool, error) {
|
||||
}
|
||||
// 尝试任一 provider 的 userinfo 端点验证
|
||||
tokenObj := &OAuthToken{AccessToken: token}
|
||||
ctx := context.Background()
|
||||
for _, p := range providers {
|
||||
if _, err := m.GetUserInfo(p.Provider, tokenObj); err == nil {
|
||||
if _, err := m.GetUserInfo(ctx, p.Provider, tokenObj); err == nil {
|
||||
return true, nil
|
||||
}
|
||||
}
|
||||
@@ -469,7 +466,8 @@ func (m *DefaultOAuthManager) ValidateTokenWithProvider(provider OAuthProvider,
|
||||
|
||||
// 通过 provider 的 userinfo 端点验证 token
|
||||
tokenObj := &OAuthToken{AccessToken: token}
|
||||
_, err := m.GetUserInfo(provider, tokenObj)
|
||||
ctx := context.Background()
|
||||
_, err := m.GetUserInfo(ctx, provider, tokenObj)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user