AWSMobileClient获取IdToken遇No cached session错误,求API传有效令牌方案
解决方案
要确保每次API调用都能获取到有效的IdToken,你不能直接同步调用getTokens()——令牌过期后该方法会抛出无缓存会话的异常。正确的做法是利用AWSMobileClient的fetchAuthSession()方法,它会自动尝试刷新过期的令牌,或在会话有效时直接返回缓存令牌。
实现步骤:
- 改用异步方式调用
fetchAuthSession(),规避同步调用的异常问题 - 在回调中获取有效IdToken后,再添加到请求头发起API调用
- 处理刷新失败的场景(比如用户会话过期需重新登录)
代码示例:
AWSMobileClient.getInstance().fetchAuthSession(new Callback<AuthSession>() { @Override public void onResult(AuthSession result) { switch (result.getAuthenticationState()) { case AUTHENTICATED: // 获取有效IdToken String idToken = result.getIdToken().getTokenString(); // 添加到请求头 headers.put(AUTHORIZATION, Constants.BEARER_TAG + idToken); // 发起API调用 performApiCall(headers); break; case SIGNED_OUT: // 用户已登出,引导重新登录 handleUserSignOut(); break; default: // 会话无效(如刷新失败),处理异常流程 handleSessionInvalid(); break; } } @Override public void onError(Exception e) { e.printStackTrace(); // 处理会话获取失败的情况 handleSessionError(e); } });
关键说明:
fetchAuthSession()会自动处理令牌刷新:若当前令牌未过期,直接返回缓存值;若已过期,会调用AWS Cognito的刷新接口获取新IdToken- 必须异步执行:令牌刷新属于网络请求,不能在主线程同步调用,否则会阻塞或抛出异常
- 根据状态分支处理:通过
AuthenticationState判断会话状态,覆盖登出、无效等场景,避免未处理的异常
如果你的项目使用RxJava或Kotlin协程,也可以使用对应的异步封装方法(如fetchAuthSession()的Rx版本),确保异步执行并正确处理结果。
内容的提问来源于stack exchange,提问作者Suresh Ramasamy
相关产品推荐
相关产品推荐

