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
相关产品推荐
相关产品推荐

