使用节点签署AWS API网关请求

时间:2017-10-21 03:11:06

标签: javascript node.js api amazon-web-services signature

我一直在寻找限制访问使用在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

谢谢!

2 个答案:

答案 0 :(得分:-1)

以下是签名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

希望它有所帮助。

答案 1 :(得分:-2)

Amazon API使用从您的访问密钥派生的签名来控制对Amazon资源的访问。我认为您将此与控制对不同的API网关的访问混淆。

API Gateway支持多种访问控制机制,包括计量或跟踪客户使用API​​密钥的API使用。标准AWS IAM角色和策略提供灵活且强大的访问控制,可应用于整个API集或单个方法。自定义授权者和Amazon Cognito用户池提供可自定义的授权和身份验证解决方案。

Control Access in API Gateway