Android应用Amplify Auth登录时accessToken为null的问题求助
解决Amplify Auth重启模拟器后登录报accessToken为空的问题
这个问题的核心是Amplify Auth的本地会话缓存在模拟器重启后出现损坏,导致再次登录时尝试使用空的accessToken参数触发校验错误。以下是几种可行的修复方案:
1. 登录前校验会话状态,清理无效缓存
在发起登录请求前,先主动检查当前的认证会话状态,一旦发现缓存的会话无效(比如accessToken为空),强制登出清理本地缓存后再重新登录。示例代码如下:
// 检查会话状态并处理登录 private void checkSessionAndLogin() { Amplify.Auth.fetchAuthSession( result -> { if (!result.isSignedIn()) { // 用户未登录,直接执行登录流程 performLogin(); return; } // 校验Cognito会话中的accessToken有效性 if (result.getData() instanceof AWSCognitoAuthSession) { AWSCognitoAuthSession cognitoSession = (AWSCognitoAuthSession) result.getData(); AuthToken accessToken = cognitoSession.getAccessToken(); if (accessToken.getValue() == null || accessToken.getValue().isEmpty()) { // 缓存的accessToken为空,强制登出清理缓存 Amplify.Auth.signOut( signOutRes -> performLogin(), signOutErr -> { // 登出失败也直接尝试登录 performLogin(); } ); } else { // 会话有效,跳转至主页 navigateToHomeScreen(); } } else { // 未知会话类型,直接登录 performLogin(); } }, error -> { // 获取会话失败,清理缓存后重试登录 Amplify.Auth.signOut( signOutRes -> performLogin(), signOutErr -> performLogin() ); } ); } // 你的登录逻辑 private void performLogin() { Amplify.Auth.signIn( "username", "password", result -> { if (result.isSignInComplete()) { navigateToHomeScreen(); } }, error -> { // 处理登录错误 } ); }
2. 检查Amplify缓存配置
打开amplifyconfiguration.json文件,确认Auth模块的缓存配置是否正确启用了持久化存储:
- 确保Cognito配置中的
storage项使用的是安全持久化方式(比如EncryptedSharedPreferences),避免模拟器重启后缓存丢失。 - 检查应用的
AndroidManifest.xml是否添加了必要权限:<uses-permission android:name="android.permission.INTERNET" />
3. 升级Amplify SDK版本
这个错误可能是SDK的已知bug,建议升级到最新稳定版的Amplify Auth库。在项目的build.gradle(Module级别)中更新依赖:
dependencies { implementation 'com.amplifyframework:aws-auth-cognito:2.14.0' // 替换为最新版本 implementation 'com.amplifyframework:core:2.14.0' }
4. 规避模拟器存储异常
模拟器的临时存储偶尔会出现读写异常,导致Amplify无法正常维护缓存:
- 尽量使用带有持久化存储的模拟器实例,避免使用临时创建的模拟器。
- 确保应用的数据目录拥有正确的读写权限,可在模拟器设置中检查应用存储权限是否开启。
内容的提问来源于stack exchange,提问作者k1r4n
相关产品推荐
相关产品推荐

