无托管UI下Amplify与OpenID Connect联合身份认证失败求助
问题排查与解决建议
针对你遇到的NotAuthorizedException: Invalid login token. Not a valid OpenId Connect identity token错误,以下是几个可能的原因和对应的解决方法:
1. 过期时间计算错误
你的代码中expires_at的计算逻辑有误:
expires_at: user.exp * 1000 + new Date().getTime()
user.exp本身就是令牌的过期时间(Unix时间戳,单位为秒),转成毫秒只需要乘以1000即可,加上当前时间会导致过期时间被错误放大,让Cognito判定令牌无效。修改为:
expires_at: user.exp * 1000
2. 身份提供商名称不匹配
Auth.federatedSignIn中传入的提供商名称,必须和你在Cognito用户池里配置的OIDC身份提供商的提供商名称(不是显示名称)完全一致(大小写敏感)。比如如果Cognito里配置的是小写line,这里传入'LINE'就会匹配失败,导致令牌验证不通过。
3. 令牌类型或格式问题
确认liff.getIDToken()返回的是OIDC标准的ID Token:
- 用jwt.io解码令牌,检查
typ字段是否为ID Token,Cognito只接受OIDC的ID Token,而非Access Token; - 确保令牌的
iss(颁发者)字段和你在Cognito OIDC配置里填写的Issuer URL完全一致,包括协议(https://)和结尾是否带斜杠。
4. Cognito OIDC配置验证
检查Cognito用户池的OIDC身份提供商配置:
- 确认授权范围包含
openid(必须勾选,否则LINE不会返回标准的ID Token); - 确认ID Token签名验证处于启用状态,Cognito需要验证令牌的签名有效性,若LINE的JWKS端点无法被Cognito访问或配置错误,会导致令牌验证失败。
5. Amplify federatedSignIn调用格式错误
Amplify的Auth.federatedSignIn针对自定义OIDC提供商,推荐使用对象参数的调用方式,而非分开传递参数。修改你的调用代码:
const cred = await Auth.federatedSignIn({ provider: 'LINE', token: token, expires_at: user.exp * 1000 });
内容的提问来源于stack exchange,提问作者Daniel Brown
相关产品推荐
相关产品推荐

