迁移至@aws-amplify/auth v6获取用户属性时遇身份池令牌错误
解决Amplify v6迁移后
fetchUserAttributes调用返回400错误(Token is not from a supported provider) 问题背景
将React Native应用从Amplify v5.3.x迁移到v6后,调用fetchUserAttributes获取已登录用户属性时,收到400错误,提示Token is not from a supported provider of this identity pool。v5中使用Auth.currentAuthenticatedUser()可正常获取属性,v6核心代码如上。
核心原因
Amplify v6的Auth配置逻辑与v5存在差异:你的配置中包含identityPoolId,导致Amplify尝试通过身份池获取身份凭证,但身份池未正确关联当前用户池作为可信提供商,或配置格式不符合v6要求。此外,仅获取用户属性不需要依赖身份池,可先简化配置排查问题。
解决方案
步骤1:简化Auth配置(移除身份池,仅保留用户池配置)
如果仅需获取用户属性,无需身份池相关功能,直接从配置中移除identityPoolId和allowGuestAccess(fetchUserAttributes调用的是Cognito用户池API,与身份池无关):
Amplify.configure({ Auth: { Cognito: { userPoolId: "eu-west-2_xxx", userPoolClientId: "xxx", signUpVerificationMethod: "code", userAttributes: { email: { required: true, }, phone_number: { required: true, }, name: { required: true, }, }, }, }, });
步骤2:确保调用时机正确(等待用户登录状态就绪)
在v6中,建议通过useAuthenticator的user状态判断用户是否已完全登录,避免在登录流程未完成时调用fetchUserAttributes:
const UserProfile = () => { const [attributes, setAttributes] = useState<FetchUserAttributesOutput>(); const { user } = useAuthenticator(); // 获取登录用户状态 useEffect(() => { if (!user) return; // 用户未登录时跳过执行 fetchUserAttributes().then(setAttributes).catch(console.error); }, [user]); // 依赖user状态,登录状态变化时重新获取 // 其余代码保持不变 };
步骤3:若需身份池,修复身份池关联配置
如果应用确实需要使用身份池(比如访问其他AWS服务),需完成以下配置:
- AWS控制台配置:在Cognito身份池的「认证提供商」列表中,添加当前用户池,确保用户池ID和应用客户端ID与代码配置一致。
- Amplify v6配置补充:明确指定身份池的认证提供商:
Amplify.configure({ Auth: { Cognito: { userPoolId: "eu-west-2_xxx", userPoolClientId: "xxx", identityPoolId: "eu-west-2:xxx", authenticationProviders: { cognito: [ { userPoolId: "eu-west-2_xxx", clientId: "xxx", }, ], }, signUpVerificationMethod: "code", userAttributes: { // 保持原有属性配置 }, allowGuestAccess: false, }, }, });
额外检查点
- 确认用户池的应用客户端已启用
ALLOW_USER_SRP_AUTH等必要的认证流程。 - 检查身份池的「未认证身份访问」是否已关闭(与配置中的
allowGuestAccess: false保持一致)。
内容的提问来源于stack exchange,提问作者Zac Tolley
相关产品推荐
相关产品推荐

