使用AWS Android SDK发送JWT令牌
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用AWS Android SDK发送JWT令牌相关的知识,希望对你有一定的参考价值。
我们有一些API网关端点。每个端点都受自定义授权程序(CA)保护。此CA检查HTTP调用并验证是否存在Authorization
标头。此标头必须包含OpenId Connect标记(简单的JWT标记),因此CA可以检查它并进行一些检查和验证。
当我们使用Postman调用端点时,它可以正常工作,因为我们可以设置正确的标头。
当我们使用生成的android SDK进行相同的调用时,问题开始引发,因为每次尝试进行调用都会将AWS4签名作为标头发送。我们可以弄清楚如何使用JWT发送Authorization
头。
我们通过扩展ApiClientFactory类并以显式方式添加标头来获得我们需要的东西:
public class CustomApiClientFactory extends ApiClientFactory {
private String LOGIN_NAME = "a.provider.com";
private AWSCredentialsProvider provider;
@Override
public ApiClientFactory credentialsProvider(AWSCredentialsProvider provider) {
this.provider = provider;
return super.credentialsProvider(provider);
}
@Override
ApiClientHandler getHandler(String endpoint, String apiName) {
final Signer signer = provider == null ? null : getSigner(getRegion(endpoint));
// Ensure we always pass a configuration to the handler
final ClientConfiguration configuration = new ClientConfiguration();
return new ApiClientHandler(endpoint, apiName, signer, provider, null, configuration) {
@Override
Request<?> buildRequest(Method method, Object[] args) {
Request<?> request = super.buildRequest(method, args);
request.addHeader("Authorization", "Bearer " + ((CognitoCachingCredentialsProvider) provider).getLogins().get(LOGIN_NAME));
return request;
}
};
}
}
即使它有效,它听起来像一个解决方法。面对这个问题有一些已知的最佳实践?
答案
API网关允许为每个方法定义请求,只需在方法请求中添加HTTP请求标头,生成的SDK将有一个字段来指定标头。
生成的Android SDK:
@com.amazonaws.mobileconnectors.apigateway.annotation.Operation(path = "/companies", method = "GET")
CompanyList companiesGet(
@com.amazonaws.mobileconnectors.apigateway.annotation.Parameter(name = "x-vendor-authorization", location = "header")
String xVendorAuthorization,
@com.amazonaws.mobileconnectors.apigateway.annotation.Parameter(name = "continuationToken", location = "query")
String continuationToken,
@com.amazonaws.mobileconnectors.apigateway.annotation.Parameter(name = "pageSize", location = "query")
String pageSize,
@com.amazonaws.mobileconnectors.apigateway.annotation.Parameter(name = "properties", location = "query")
String properties);
SDK调用:
client.companiesGet("abc123AuthToken", "continueToken1", "20", "prop1");
以上是关于使用AWS Android SDK发送JWT令牌的主要内容,如果未能解决你的问题,请参考以下文章
AWS Cognito 如何验证我自己的 IdP 颁发的身份令牌?
更改 AWS Cognito 访问令牌 JWT 中的加密算法