React Native中AWS Cognito Auth.federatedSignIn()未等待认证结果问题
解决React Native中AWS Amplify Google登录的认证用户设置问题
核心问题分析
React Native环境下,Auth.federatedSignIn()仅负责触发第三方登录跳转(Google),不会等待用户完成整个认证流程(跳转至外部浏览器/WebView再返回),因此直接用await调用会立即进入catch分支,导致后续无法正确获取认证用户。此外,跳转回应用后需手动处理URL中的token,完成Amplify会话的初始化。
分步解决方案
1. 重构Google登录触发逻辑
移除await,仅触发登录跳转即可,无需等待返回结果:
import { Auth } from 'aws-amplify'; import { CognitoHostedUIIdentityProvider } from '@aws-amplify/auth/lib/types'; const signInWithGoogle = () => { try { // 仅触发Google登录跳转,不等待异步结果 Auth.federatedSignIn({ provider: CognitoHostedUIIdentityProvider.Google, }); } catch (error) { console.error('触发Google登录失败:', error); } };
2. 处理跳转回应用的URL,完成认证会话初始化
用户登录成功跳转回应用时,URL携带的#token需传给Auth.handleAuthResponse(),让Amplify解析并初始化认证会话。在应用入口组件(如App.tsx)中添加监听:
import { Linking, useEffect } from 'react-native'; import { Auth } from 'aws-amplify'; useEffect(() => { const handleAuthRedirect = async (url: string) => { // 过滤Amplify认证跳转的URL if (url.includes('#token')) { try { // 让Amplify处理token,完成会话初始化 await Auth.handleAuthResponse(url); // 此时可正常获取当前认证用户 const currentUser = await Auth.currentAuthenticatedUser(); console.log('已完成认证,当前用户:', currentUser); } catch (error) { console.error('处理认证响应失败:', error); } } }; // 处理应用启动时的初始跳转URL Linking.getInitialURL().then(handleAuthRedirect); // 监听后续的链接跳转事件 const linkSubscription = Linking.addEventListener('url', ({ url }) => handleAuthRedirect(url)); return () => linkSubscription.remove(); }, []);
3. 修复currentAuthenticatedUser获取失败问题
需确保在Auth.handleAuthResponse()执行完成后再调用该方法,可添加简单重试机制避免异步延迟问题:
const getCurrentAuthenticatedUser = async () => { try { return await Auth.currentAuthenticatedUser({ bypassCache: false }); } catch (error) { // 首次失败后延迟1秒重试 await new Promise(resolve => setTimeout(resolve, 1000)); try { return await Auth.currentAuthenticatedUser({ bypassCache: false }); } catch (retryError) { console.error('获取当前用户失败:', retryError); return null; } } };
4. 校验Amplify与Cognito配置一致性
确保aws-exports.js中的OAuth配置与Cognito用户池应用客户端的回调/注销URL完全匹配:
// aws-exports.js示例配置 export default { // ...其他基础配置 "oauth": { "domain": "your-cognito-domain.auth.region.amazoncognito.com", "scope": ["email", "openid", "profile"], "redirectSignIn": "your-app-scheme://callback", // 需与Cognito控制台配置一致 "redirectSignOut": "your-app-scheme://signout", "responseType": "token" // 必须为token,对应URL中的#token参数 } };
关键结论
federatedSignIn仅做跳转触发,不能用await等待结果- 跳转回应用后必须调用
Auth.handleAuthResponse()处理token,完成会话初始化 - 只有完成会话初始化后,
currentAuthenticatedUser才能正确返回用户信息 - 必须保证Amplify与Cognito的OAuth配置完全对齐
内容的提问来源于stack exchange,提问作者Aki
相关产品推荐
相关产品推荐

