我正在处理一些遗留应用程序,并希望使用Amazon AWS API Gateway来缓解一些缺点。
应用程序A,能够使用参数调用URL,但不支持HTTP基本AUTH。像这样:
https://example.com/api?param1=xxx¶m2=yyy
应用程序B能够处理这些调用并做出响应。但是应用程序B需要HTTP基本身份验证。
现在的问题是,我可以使用亚马逊AWS API网关来缓解这个问题吗?
我们的想法是创建这种风格的API:
http://amazon-aws-api.example.com/api?authcode=aaaa¶m1=xxx¶m2=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¶m2=yyy",
"auth": "user:password"
}
我想从这里开始的最好方法是使用API网关提供如下界面:
https://amazon-aws-api.example.com/api?user=user&pass=pass¶m1=xxx¶m2=yyy
由于HTTPs请求的参数是加密的并且它们不存储在Lambda中,因此该方法应该非常安全。
现在的问题是,如何将API网关连接到Lambda。
答案 0 :(得分:0)
您可以实现AWS API Gateway提到的方案。但是,它不仅仅是代理集成,而是需要一个Lambda函数,它将通过转换来转发请求。
如果凭据是固定凭据以调用API,则可以使用Lambda中的环境变量来存储它们,并使用AWS KMS密钥进行加密。
但是,如果为每个用户发送凭据(例如从Web浏览器登录到应用程序),则此方法的缺点是您需要存储用户名和密码,同时还要检索它。它甚至不鼓励存储密码甚至加密。如果是这种情况,那么它更好地通过(也进行转换)而不是在它们之间存储和检索。