调用Google federatedSignIn返回NotAuthorizedException问题求助
我来帮你排查这个问题,这个错误本质是Cognito身份池不承认你传入的Google令牌,大概率是配置细节或者令牌传递的问题,咱们一步步梳理可能的原因和解决办法:
1. 先确认传递的是Google ID Token而非Access Token
angular5-social-login返回的userData里包含两种令牌,但Cognito的federatedSignIn只认ID Token,不是Access Token。你可以在代码里明确指定使用ID Token:
this.socialAuthService.signIn(socialPlatformProvider).then((userData) => { // 务必使用idToken,不要用accessToken const validGoogleToken = userData.idToken; // 调用Cognito的联合登录接口 Auth.federatedSignIn('google', { token: validGoogleToken }, {}) .then(res => console.log("登录成功", res)) .catch(err => console.error("登录失败", err)); });
你可以打印userData.idToken看看,正常的ID Token是JWT格式的三段式字符串(用.分隔)。
2. 核对Cognito身份池的Google提供商配置
进入AWS控制台的Cognito身份池,检查「联合身份提供商」下的Google配置:
- 确保客户端ID和你在Google Cloud Console创建的OAuth 2.0客户端ID完全一致,注意大小写、特殊字符,不能有任何拼写错误。
- 确认Google提供商处于启用状态,没有被意外禁用。
同时在Google Cloud Console里:
- 对应的OAuth客户端要开启
Google+ API或People API(部分旧版本SDK依赖)。 - 重定向URI虽然前端登录用得少,但也要确保配置的域名和你的应用匹配(比如
http://localhost:4200本地开发环境)。
3. 验证Google ID Token的受众(Audience)是否匹配
用jwt.io解码你的Google ID Token,查看aud字段,这个值必须和Cognito里配置的Google客户端ID完全一致。如果aud是另一个客户端ID,说明你用错了Google应用的令牌,得检查angular5-social-login的配置是否正确。
4. 检查Cognito身份池的信任关系策略
身份池关联的IAM角色信任策略必须允许Google作为身份提供商,策略里需要包含类似这样的语句:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "accounts.google.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "accounts.google.com:aud": "你的Google客户端ID" } } } ] }
如果这里的aud不匹配,或者没有添加Google的Federated主体,就会触发授权错误。
5. 确认angular5-social-login的配置正确性
在你的app.module.ts里,Google提供商的客户端ID必须和Cognito、Google Cloud里的完全一致:
import { SocialLoginModule, SocialAuthServiceConfig } from 'angular5-social-login'; import { GoogleLoginProvider } from 'angular5-social-login'; @NgModule({ imports: [SocialLoginModule], providers: [ { provide: 'SocialAuthServiceConfig', useValue: { autoLogin: false, providers: [ { id: GoogleLoginProvider.PROVIDER_ID, provider: new GoogleLoginProvider( "你的Google客户端ID" // 必须和其他配置保持一致 ) } ] } as SocialAuthServiceConfig, } ] })
总结
最常见的问题就是令牌类型错误、客户端ID不匹配或者信任策略配置缺失,你可以按照上面的步骤逐一排查,基本能解决这个NotAuthorizedException问题。
内容的提问来源于stack exchange,提问作者KyelJmD

