React Native对接AWS Amplify Cognito联邦谷歌登录首次报错问题
首次登录报错的具体原因
你遇到的ValidationException报错本质是首次调用Cognito登录接口时,请求参数中logins映射内的谷歌身份提供商对应token值为空,不满足Cognito要求的长度≥1的约束,常见触发场景如下:
- 谷歌授权异步时序错位:React Native端获取谷歌OAuth token的接口是异步请求,首次点击登录按钮时,代码没有等待谷歌授权流程完成、token返回就直接调用了Amplify的
federatedSignIn方法,此时传入的logins参数中谷歌提供商对应的token值为undefined或空字符串,触发校验失败。第二次点击登录时,首次触发的谷歌授权流程已经完成,token已经缓存在本地变量/存储中,调用时参数完整,因此可以正常登录。 - Amplify Auth模块初始化未完成:如果登录按钮的可点击时机早于Amplify Auth模块初始化完成的节点,首次调用登录方法时,Amplify还未加载完成Cognito的联邦身份提供商配置,会自动清空
logins映射内的对应值,导致校验失败。第二次点击时Auth模块已经完成初始化,配置加载完整,参数正常。 - React状态更新异步问题:如果你的代码逻辑是先将谷歌返回的token存入React组件state,再从state中读取token传给
federatedSignIn,由于React的state更新是异步的,首次点击时state还未完成更新就读取token,拿到的是初始空值,第二次点击时state已经更新完成,可读取到有效token。
你可以在调用federatedSignIn的代码前打印logins参数的完整值,首次点击时如果观测到谷歌对应的token字段为空,即可确认是上述时序类问题导致。
内容的提问来源于stack exchange,提问作者Ismeet
相关产品推荐
相关产品推荐

