如何用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
相关产品推荐
相关产品推荐

