You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 21:37:26