对于我们的 AWS API 端点,我们使用 AWS_IAM 授权并希望从 Swagger UI 进行调用。 要成功调用,必须有 2 个标头“Authorization”和“x-amz-date”。为了形成“授权”,我们使用 aws doc 中的以下步骤。 我们必须在每次调用时更改“x-amz-date”才能完成授权。 问题是:如何在 Swagger 中编写脚本来签署请求,该脚本每次在请求发送到 aws 之前运行? (我们知道如何在加载 Swagger 页面之前一次指定两个标头,但是应该在每次调用之前重新运行此过程。 提前致谢。
swagger-jsrequestInterceptor
来执行此操作。 swagger-ui 项目在底层使用 swagger-js。 只需创建一个请求拦截器,如下所示:
requestInterceptor: {
apply: function (request) {
// modify the request object here
return request;
}
}
并将其应用到创建时的 swagger 实例中:
window.swaggerUi = new SwaggerUi({
url: url,
dom_id: "swagger-ui-container",
requestInterceptor: requestInterceptor,
在这里,您可以在
request
对象中设置标头(注意,这不是standard
javascript http 请求对象,请检查它以了解详细信息)。 但您确实可以访问此处的所有标头,因此您可以根据需要计算和注入它们。
您可以轻松地将 AWS SDK 中的 Monkeypatch 签名签名到 SwaggerJS(以及 SwaggerUI)中。请参阅此处
我有一个稍微修改过的 SwaggerUI here。给定一些 AWS 凭证和 API ID,它将拉取 Swagger 定义,将其显示在 SwaggerUI 中,然后您可以使用 sigv4 调用 API。
授权者实现如下所示:
var AWSSigv4RequestSigner = function(credentialProvider, aws) {
this.name = "sigv4";
this.aws = aws;
this.credentialProvider = credentialProvider;
};
AWSSigv4RequestSigner.prototype.apply = function(options, authorizations) {
var serviceName = "execute-api";
//If we are loading the definition itself, then we need to sign for apigateway.
if (options && options.url.indexOf("apigateway") >= 0) {
serviceName = "apigateway";
}
if(serviceName == "apigateway" || (options.operation && options.operation.authorizations && options.operation.authorizations[0].sigv4))
{
/**
* All of the below is an adapter to get this thing into the right form for the AWS JS SDK Signer
*/
var parts = options.url.split('?');
var host = parts[0].substr(8, parts[0].indexOf("/", 8) - 8);
var path = parts[0].substr(parts[0].indexOf("/", 8));
var querystring = parts[1];
var now = new Date();
if (!options.headers)
{
options.headers = [];
}
options.headers.host = host;
if(serviceName == "apigateway")
{
//For the swagger endpoint, apigateway is strict about content-type
options.headers.accept = "application/json";
}
options.pathname = function () {
return path;
};
options.methodIndex = options.method;
options.search = function () {
return querystring ? querystring : "";
};
options.region = this.aws.config.region || 'us-east-1';
//AWS uses CAPS for method names, but swagger does not.
options.method = options.methodIndex.toUpperCase();
var signer = new this.aws.Signers.V4(options, serviceName);
//Actually add the Authorization header here
signer.addAuthorization(this.credentialProvider, now);
//SwaggerJS/yourbrowser complains if these are still around
delete options.search;
delete options.pathname;
delete options.headers.host;
return true;
}
return false;
};
在客户端(浏览器)签名意味着从浏览器使用aws凭证......这是不安全的。 我认为后端签名或 Cognito 更适合正确执行签名。