使用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将有一个字段来指定标头。

控制台:console view that allows adding header

生成的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 中的加密算法

AWS Cognito JWT 令牌验证

AWS Cognito 中的“访问令牌不包含 openid 范围”

REST API 发送 JWT

如何使用 Aws AppSync 将 JWT 令牌(或任何其他变量)从父解析器传递给子解析器