当前位置: 首页 > 知识库问答 >
问题:

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

茅星华
2023-03-14

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

提前谢谢。

共有2个答案

龙昊焱
2023-03-14

您可以非常容易地将AWS SDK中的签名修改成SwaggerJS(从而修改SwaggerUI)。看这里

我这里有一个稍微修改过的SwaggerUI。给定一些AWS凭据和一个API ID,它将下拉Swagger定义,将其显示在SwaggerUI中,然后您可以使用sigv4调用API。

Authorizer实现如下所示:

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;
};
赵晨
2023-03-14

swagger-js中有内置的支持来添加< code>requestInterceptor来实现这一点。swagger-ui项目在幕后使用了swagger-js。

只需创建一个请求拦截器,如下所示:

requestInterceptor: {
  apply: function (request) {
    // modify the request object here
    return request;
  }
}

并在创建时将其应用于您的昂首阔步实例:

window.swaggerUi = new SwaggerUi({
  url: url,
  dom_id: "swagger-ui-container",
  requestInterceptor: requestInterceptor,

在这里,您可以在请求对象中设置标头(注意,这不是标准的javascript http请求对象,请检查它以获取详细信息)。但是您确实可以访问此处的所有标头,因此您可以根据需要计算和注入它们。

 类似资料:
  • 我试图用这个例子来计算s3上传的AWS4签名-http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html 我正在使用示例中提供的值,但没有从ComputeSignature方法中获得期望值。我怀疑这是因为我正在为“signedheaders”参数传递一个空字符串(如果是,那么应该是什么?)。有人能解释一下我做错了什么

  • 我正在按照示例指南使用python发送电子邮件,并得到一个错误,该错误表示“我们计算的请求签名与您提供的签名不匹配。请检查您的AWS秘密访问密钥和签名方法。”问题是我没有自签任何东西。博托应该在后端处理所有这些。 翻看关于S3 buckets的类似问题的评论,很多人对他们键中的特殊字符有困难。一个人说这个问题是关键的a+。我尝试创建新凭据,因为我的凭据确实有+。新的凭据中有一个/,相反,我得到的错

  • 我正在使用spring security saml扩展来实现SSO,并将ADF作为IDP。 据我所知,Spring Security使用open saml对SAML请求进行签名,并使用SHA1with RSA作为签名算法。 我们需要更改以使用SHA256withRSA签署SAML请求。 这怎么能做到呢? 感谢您对此提出的任何建议。提前非常感谢

  • 我正试图上传一张使用AWS S3 SDK的图片。现在,这以前是有效的,但由于某种原因,它停止了工作,我开始得到这个错误: 现在,当我点击链接时,它会给我一个'NoSuchKey'错误: 我真的不明白这一点,因为我的键实际上只是一个字符串。我也试图上传一些东西,所以显然关键不会存在-我正在努力上传它! 另一个教程来自一个博客,我没有它的链接,但我上面的代码与文档中的这个教程相同。我所做的只是把它移到

  • 我想将用户配置文件图片存储在S3桶中,但保留这些图片的私密性。为了做到这一点,我正在创建一个预先签名的网址,每当图像是必需的。然而,这每次都会创建一个独特的网址,这意味着浏览器永远不会缓存图像,最终我会在GET请求中支付更多。 下面是生成url的代码示例,我使用的是Laravel: 我认为,通过指定日期时间而不是时间单位,它将创建相同的url,但实际上会将剩余秒数添加到url,下面是一个示例: x

  • 当我从REST客户端调用APIendpoint时,由于涉及Signature而出错。 请求: 主持人:https://xxx.execute-api.ap-southeast-1.amazonaws.com/latest/api/name 授权: AWS4-HMAC-SHA256凭据=/20160314/ap-东南-1/执行-api/aws4_request, SignedHeaders=host