如何通过Amplify Cognito验证用户登录状态及账号有效性?
解决方案
问题根源
Amplify.Auth.currentUser仅读取本地缓存的用户信息,不会主动与Cognito后端校验账号的实际状态(是否被封禁、注销),所以后台操作后本地缓存未更新时,仍会返回非null值。
正确的登录状态校验方式
不要仅依赖本地缓存,需主动与Cognito后端校验会话有效性,推荐使用fetchAuthSession方法,它会验证令牌的合法性及账号状态:
代码示例
fun checkValidAuthState() { // 先检查本地是否有缓存用户 val localUser = Amplify.Auth.currentUser if (localUser == null) { // 无本地缓存,直接跳登录页 navigateToAuthScreen() return } // 主动与后端校验会话有效性 Amplify.Auth.fetchAuthSession( { sessionResult -> if (sessionResult.isValid) { // 会话有效,账号状态正常,进入主应用 navigateToMainApp() } else { // 会话无效,清除本地缓存并跳登录页 Amplify.Auth.signOut() navigateToAuthScreen() } }, { error -> // 校验失败(如账号被封禁、token失效等),清除缓存并跳登录页 Amplify.Auth.signOut() navigateToAuthScreen() } ) } // 辅助导航方法(根据你的应用框架实现) fun navigateToMainApp() { /* ... */ } fun navigateToAuthScreen() { /* ... */ }
自动登录的最优实现
不需要保存用户名和密码,Amplify会自动缓存有效的refresh token,应用启动时通过该令牌刷新会话即可实现自动登录:
- 首次登录成功后,Amplify会在本地存储refresh token、access token等信息
- 应用重启时,调用
fetchAuthSession会自动用refresh token向Cognito请求新的access token - 如果refresh token有效且账号状态正常,就能完成自动登录;若token失效或账号被封,会触发错误回调,此时清除缓存并引导用户重新登录
关键注意事项
- 禁止明文存储用户名和密码,避免安全风险,依赖Amplify的令牌缓存机制即可
- 当Cognito后台封禁/注销用户时,对应的refresh token会立即失效,
fetchAuthSession会返回错误,此时需清除本地缓存并跳转登录页
内容的提问来源于stack exchange,提问作者Leyonad
相关产品推荐
相关产品推荐

