如何在请求之前在Swagger中计算AWS签名V4

问题描述 投票:0回答:3

对于我们的 AWS API 端点,我们使用 AWS_IAM 授权并希望从 Swagger UI 进行调用。 要成功调用,必须有 2 个标头“Authorization”和“x-amz-date”。为了形成“授权”,我们使用 aws doc 中的以下步骤。 我们必须在每次调用时更改“x-amz-date”才能完成授权。 问题是:如何在 Swagger 中编写脚本来签署请求,该脚本每次在请求发送到 aws 之前运行? (我们知道如何在加载 Swagger 页面之前一次指定两个标头,但是应该在每次调用之前重新运行此过程。 提前致谢。

swagger-js
amazon-web-services swagger swagger-ui
3个回答
4
投票
requestInterceptor

来执行此操作。 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)中。请参阅

此处

2
投票

我有一个稍微修改过的 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 更适合正确执行签名。

0
投票

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.