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

如何用Apple登录JWT在React Native(Expo)中对接AWS Cognito认证

Expo React Native 中使用Apple登录JWT令牌完成AWS Cognito认证

需求背景

使用Expo开发React Native应用,实现应用内Apple登录(无浏览器跳转),已通过expo-apple-authentication获取Apple返回的JWT令牌,需用该令牌完成AWS Cognito用户认证,且不使用Amplify托管UI的signInRedirect(iOS存在已知bug)。

已完成配置

  • AWS Cognito控制台已配置Apple作为身份提供商
  • Apple开发者账户已创建对应的App ID和Service ID
  • 实现了应用内Apple登录,成功获取JWT令牌(identityToken)

实现方案

方案1:使用AWS Amplify(推荐)

利用Amplify Auth模块的federatedSignIn方法,直接传入Apple的JWT令牌完成认证,无需跳转。

步骤1:确保Amplify配置正确

import Amplify from 'aws-amplify';
import { Auth } from 'aws-amplify';

Amplify.configure({
  Auth: {
    region: '你的AWS区域',
    userPoolId: '你的Cognito用户池ID',
    userPoolWebClientId: '你的Cognito应用客户端ID',
    // 无需配置oauth redirectUri,因为采用应用内认证
  },
});

步骤2:在Apple登录成功后调用认证

修改你的loginApple方法,获取到userToken后,调用以下代码:

const loginApple = async () => {
  try {
    const credential = await AppleAuthentication.signInAsync({
      requestedScopes: [
        AppleAuthentication.AppleAuthenticationScope.EMAIL,
        AppleAuthentication.AppleAuthenticationScope.FULL_NAME,
      ],
    });

    // 提取Apple返回的JWT身份令牌
    const appleIdToken = credential.identityToken;

    // 用Apple令牌完成Cognito认证
    const cognitoUser = await Auth.federatedSignIn({
      provider: 'Apple',
      token: appleIdToken,
    });

    console.log('Cognito认证成功:', cognitoUser);
    // 后续可通过Auth.currentAuthenticatedUser()获取用户信息
  } catch (error) {
    console.error('Apple登录或Cognito认证失败:', error);
  }
};

方案2:直接使用AWS JavaScript SDK

如果不想依赖Amplify,可直接调用CognitoIdentityServiceProvider的initiateAuth方法:

步骤1:安装依赖

npm install aws-sdk

步骤2:调用认证接口

import { CognitoIdentityServiceProvider } from 'aws-sdk';

const cognitoClient = new CognitoIdentityServiceProvider({
  region: '你的AWS区域',
});

const authenticateWithAppleToken = async (appleIdToken, appleSub) => {
  try {
    const params = {
      AuthFlow: 'CUSTOM_AUTH',
      ClientId: '你的Cognito应用客户端ID',
      AuthParameters: {
        IDENTITY_PROVIDER: 'Apple',
        OIDC_TOKEN: appleIdToken,
        USERNAME: appleSub, // Apple返回的sub字段,作为用户唯一标识
      },
    };

    const response = await cognitoClient.initiateAuth(params).promise();
    console.log('Cognito凭证:', response.AuthenticationResult);
    // 包含AccessToken、IdToken、RefreshToken等
  } catch (error) {
    console.error('认证失败:', error);
  }
};

// 在Apple登录成功后调用
// const appleSub = credential.user; // 从Apple登录凭证中获取sub
// authenticateWithAppleToken(appleIdToken, appleSub);

注意事项

  • Apple返回的identityToken需确保未过期,可通过解码JWT验证exp字段
  • Cognito用户池需正确配置Apple身份提供商的客户端ID和密钥
  • 首次登录时,Cognito会自动创建对应用户,无需手动注册

内容的提问来源于stack exchange,提问作者CAN ROLLAS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 01:35:59