使用AWS Android SDK发送JWT令牌

花门楼前见秋草,岂能贫贱相看老。这篇文章主要讲述使用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将有一个字段来指定标头。
控制台:
使用AWS Android SDK发送JWT令牌

文章图片

生成的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);

【使用AWS Android SDK发送JWT令牌】SDK调用:
client.companiesGet("abc123AuthToken", "continueToken1", "20", "prop1");


    推荐阅读