React Native中AWS Amplify与Cognito验证邮箱时出现No current user错误
问题原因
- 本地缓存同步延迟:调用
confirmSignUp成功后,Amplify内部需要将用户的验证状态同步到本地缓存,但这个同步过程是异步的。如果在缓存还没完成更新时就调用currentSession(),就会因为本地没有有效会话数据抛出「No current user」错误。非必现的原因是网络环境、设备性能差异会导致缓存同步的速度不稳定。 - 会话未自动初始化:
confirmSignUp仅完成邮箱验证操作,Amplify不会自动为已验证用户初始化会话。currentSession()依赖已初始化的用户会话,此时会话未建立就会报错。 - React Native异步执行时序问题:
confirmSignUp的Promise虽然已resolve,但底层的用户状态更新可能还在React Native的异步队列中等待执行,此时提前调用currentSession()会拿不到最新状态。
解决方案
方案1:验证后手动执行登录(最可靠)
在confirmSignUp成功后,调用Auth.signIn()重新登录用户,确保会话被正确初始化,之后再获取令牌:
import { Auth } from "aws-amplify"; try { setLoading(true); await Auth.confirmSignUp(username, code); // 验证后重新登录,初始化会话 await Auth.signIn(username, password); // 此时再获取会话就不会有问题 const token = (await Auth.currentSession()) .getAccessToken() .getJwtToken(); } catch(err){ console.log(err); }
方案2:使用currentAuthenticatedUser()触发会话同步
currentAuthenticatedUser()会等待用户状态同步完成,或者主动触发同步,之后再从中获取会话信息:
import { Auth } from "aws-amplify"; try { setLoading(true); await Auth.confirmSignUp(username, code); // 先确保用户已被认证并同步状态 const user = await Auth.currentAuthenticatedUser({ bypassCache: true }); // 从用户对象中获取会话 const session = await user.getSession(); const token = session.getAccessToken().getJwtToken(); } catch(err){ console.log(err); }
注意:
bypassCache: true会强制从服务端拉取最新用户状态,避免缓存不一致的问题。
方案3:临时兼容方案(不推荐)
如果不想重新登录,可以手动触发用户状态刷新后延迟获取会话,但延迟时间难适配所有场景,仅作为临时方案:
import { Auth } from "aws-amplify"; try { setLoading(true); await Auth.confirmSignUp(username, code); // 手动触发用户状态刷新 await Auth.currentUserPoolUser(); // 延迟一小段时间再获取会话 setTimeout(async () => { const token = (await Auth.currentSession()) .getAccessToken() .getJwtToken(); // 处理令牌逻辑 setLoading(false); }, 500); } catch(err){ console.log(err); setLoading(false); }
内容的提问来源于stack exchange,提问作者Harsh Mishra
相关产品推荐
相关产品推荐

