You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 12:15:39