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

Android Kotlin接入AWS Amplify REST请求返回401授权错误

解决AWS Amplify REST API 401未授权问题

核心排查方向及修复步骤

1. 修复Authorization头格式(最常见原因)

绝大多数API网关要求Cognito Token的Authorization头格式为 Bearer <token>,你的代码中直接传入Token字符串,缺少Bearer前缀,这会导致网关无法识别授权信息。

修改拦截器代码:

okHttpBuilder.addInterceptor { chain ->
    val token = authProviders.oidcAuthProvider.latestAuthToken
    val originalRequest = chain.request()
    val updatedRequest = originalRequest.newBuilder()
        // 添加Bearer前缀
        .addHeader("Authorization", "Bearer $token")
        .build()
    chain.proceed(updatedRequest)
}

如果手动添加Header:

val authToken = "你的实际Token"
val options = RestOptions.builder()
    .addPath("/api/v1/me/onboard")
    .addHeaders(mapOf("Authorization" to "Bearer $authToken"))
    .build()

2. 验证Token有效性

  • 打印获取到的idToken,用JWT解析工具检查以下字段:
    • exp:Token是否过期
    • iss:是否与你的Cognito用户池域名一致
    • aud:是否匹配API网关配置的受众(如果有设置)
  • 确保fetchAuthSession确实返回了有效会话:
val session = com.amplifyframework.kotlin.core.Amplify.Auth.fetchAuthSession()
val cognitoSession = session as AWSCognitoAuthSession
// 检查是否已登录
if (!cognitoSession.isSignedIn) {
    Log.e("AuthError", "用户未实际登录")
}
// 检查Token是否存在
val idToken = cognitoSession.userPoolTokensResult.value?.idToken
if (idToken.isNullOrEmpty()) {
    Log.e("AuthError", "未获取到有效ID Token")
}

3. 检查Amplify插件配置顺序

你的configureBridge中先添加AWSApiPlugin,再添加其他插件最后调用configure,顺序是正确的,但需确认:

  • REST_API常量是否与amplifyconfiguration.json中定义的REST API名称完全一致
  • amplifyconfiguration.json里的API配置中,authorizationType是否设置为AMAZON_COGNITO_USER_POOLS

4. 验证API网关与Cognito的关联配置

  • 确认API网关的对应资源启用了Cognito用户池授权,且用户池与你的App使用的是同一个
  • 检查API网关的资源策略,是否允许当前用户的Cognito身份ARN访问该资源
  • 确认Cognito用户池中的用户(或所属用户组)具备访问该API的权限

内容的提问来源于stack exchange,提问作者Lucas Martins

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 17:27:41