我一直在寻找方法来限制对使用使用JavaScript编写的AWS Lambda函数的API的访问。
我已经找到了有关如何使用AWS Signature S4的文档,但我仍然不理解。
根据creating a signature,在应用伪代码之后,我应该获得要放置在标头上的签名。
我发现以下代码可以解决这一点:
// Example of signature generator
var crypto = require("crypto-js");
function getSignatureKey(Crypto, key, dateStamp, regionName, serviceName) {
var kDate = Crypto.HmacSHA256(dateStamp, "AWS4" + key);
var kRegion = Crypto.HmacSHA256(regionName, kDate);
var kService = Crypto.HmacSHA256(serviceName, kRegion);
var kSigning = Crypto.HmacSHA256("aws4_request", kService);
return kSigning;
}
console.log(getSignatureKey(crypto,'secretkey','date','us-east-2','iam'));
这是我的第一个问题,我不知道getSignatureKey()的输出应该是什么?这是因为在文档中它是一个很长的字符串,而我得到的输出是{words:[x,x,x,x,x,x,x,x],sigBytes:32},其中x是随机的数字。
此外,在获得签名并使用“授权”字段和其他字段填充请求的标头之后,如何过滤不正确的请求?我是否必须为AWS API创建策略,使其仅允许已签名的请求?在这里,我想我应该遵循Signing Requests。
谢谢!
最佳答案
这是签名URL的简单实现。 aws-cloudfront-sign软件包提供了更简单的实现。
var cfsign = require('aws-cloudfront-sign');
var signingParams = {
keypairId: process.env.PUBLIC_KEY,
privateKeyString: process.env.PRIVATE_KEY,
// Optional - this can be used as an alternative to privateKeyString
privateKeyPath: '/path/to/private/key',
expireTime: 1426625464599
}
// Generating a signed URL
var signedUrl = cfsign.getSignedUrl(
'http://example.cloudfront.net/path/to/s3/object',
signingParams
);
https://aws.amazon.com/blogs/developer/creating-amazon-cloudfront-signed-urls-in-node-js/
SignedURL的目的是提供私有内容。
更多详细信息,
http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/PrivateContent.html
希望能帮助到你。