AWS API Gateway作为HTTP AUTH的代理

时间:2017-10-17 23:15:18

标签: api amazon-web-services

我正在处理一些遗留应用程序,并希望使用Amazon AWS API Gateway来缓解一些缺点。

应用程序A,能够使用参数调用URL,但不支持HTTP基本AUTH。像这样: https://example.com/api?param1=xxx&param2=yyy

应用程序B能够处理这些调用并做出响应。但是应用程序B需要HTTP基本身份验证。

现在的问题是,我可以使用亚马逊AWS API网关来缓解这个问题吗?

我们的想法是创建这种风格的API: http://amazon-aws-api.example.com/api?authcode=aaaa&param1=xxx&param2=yyy 然后,亚马逊应该检查authcode是否正确,然后在使用一些存储的用户名+密码时,使用所有剩余参数从应用程序A调用API。结果应该传递回应用程序B.

我也可以提供用户名+密码作为参数,但我想使用长的authcode并在亚马逊上存储相当短的密码更安全。也可以使用像双因素身份验证中使用的更改身份验证码。

解决方案的路径:

我基于HTTPS模板创建了以下AWS Lambda函数:

'use strict';

const https = require('https');

exports.handler = (event, context, callback) => {
    const req = https.get(event, (res) => {
        let body = '';
        res.setEncoding('utf8');
        res.on('data', (chunk) => body += chunk);
        res.on('end', () => callback(null, body));
    });
    req.on('error', callback);
    req.end();
};

如果我使用Test函数并为其提供此事件,它将按预期工作:

{
    "hostname": "example.com",
    "path": "/api?param1=xxx&param2=yyy",
    "auth": "user:password"
}

我想从这里开始的最好方法是使用API​​网关提供如下界面: https://amazon-aws-api.example.com/api?user=user&pass=pass&param1=xxx&param2=yyy

由于HTTPs请求的参数是加密的并且它们不存储在Lambda中,因此该方法应该非常安全。

现在的问题是,如何将API网关连接到Lambda。

1 个答案:

答案 0 :(得分:0)

您可以实现AWS API Gateway提到的方案。但是,它不仅仅是代理集成,而是需要一个Lambda函数,它将通过转换来转发请求。

如果凭据是固定凭据以调用API,则可以使用Lambda中的环境变量来存储它们,并使用AWS KMS密钥进行加密。

但是,如果为每个用户发送凭据(例如从Web浏览器登录到应用程序),则此方法的缺点是您需要存储用户名和密码,同时还要检索它。它甚至不鼓励存储密码甚至加密。如果是这种情况,那么它更好地通过(也进行转换)而不是在它们之间存储和检索。