花门楼前见秋草,岂能贫贱相看老。这篇文章主要讲述使用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);
【使用AWS Android SDK发送JWT令牌】SDK调用:
client.companiesGet("abc123AuthToken", "continueToken1", "20", "prop1");
推荐阅读
- InApp订阅已过期,如何检查服务器端
- 从已安装该应用的设备中删除未发布的应用(Android)
- Android Studio需要澄清
- 如何在移动设备上安装android studio创建的应用程序而无需将其连接到系统
- Android 9应用程序菜单是深色背景上的暗文本
- 我可以在Android布局xml文件中定义中间行的文本
- 如何根据加载的文本增加我的android textview中的文本大小()
- 用于复制当前文本行的Applescript()
- AWS Application Load Balancer HTTP到HTTPS与EC2实例