AWS Amplify+Vue.js对接Cognito谷歌登录首次触发ValidationException问题
问题原因分析
这个首次登录失败、第二次成功的问题是谷歌身份提供商返回的有效令牌还没被Amplify正确接收解析,登录验证逻辑就被提前触发导致的,对应两个常见触发场景:
- 回调逻辑时序错误:你配置的OAuth响应类型是
responseType: "code",首次点击登录跳转到谷歌授权页,授权后回调回你的站点时,代码没有等Amplify把回调参数里的授权码兑换成有效令牌、存入本地缓存,就直接触发了登录校验逻辑,这时候logins字段对应的令牌值还没生成是空字符串,直接触发了长度≥1的校验规则报错。第二次点击的时候,本地已经缓存了上一次回调后最终生成的有效令牌,读取到有效值就校验通过登录成功。 - Amplify初始化时机错误:如果登录按钮的点击逻辑没有等Amplify完成全局初始化(尤其是
Auth模块初始化完成)就绑定生效,首次点击时Amplify还没完成和Cognito的配置同步,无法正确接收联邦登录返回的令牌,也会出现空值报错,第二次点击时初始化已经完成,就能正常读取令牌完成校验。
修复方案
- 调整回调页逻辑:所有登录校验逻辑必须放在
Auth.currentAuthenticatedUser()或者Auth.currentSession()的成功回调之后执行,不要在页面刚加载时同步调用登录校验 - 给登录按钮点击逻辑加保护:调用联邦登录之前先判断Amplify是否初始化完成,避免提前触发
- 若为自定义封装的登录逻辑,不要在回调跳转回来之后立刻触发登录校验,可添加100-200ms的延迟,或者监听Amplify的
Hub回调事件,等signIn事件触发之后再执行后续逻辑:
// 示例:监听Hub事件确认登录完成再执行后续逻辑 import { Hub } from 'aws-amplify'; Hub.listen('auth', (data) => { const { event } = data.payload; if (event === 'signIn') { // 登录完成,再执行跳转、用户信息拉取等逻辑 } });
内容的提问来源于stack exchange,提问作者tarang shah
相关产品推荐
相关产品推荐

