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