【问题标题】:AWS API Gateway as proxy for HTTP AUTHAWS API Gateway 作为 HTTP AUTH 的代理
【发布时间】:2017-10-17 23:15:18
【问题描述】:

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

应用程序 A 可以调用带参数的 URL,但不支持 HTTP 基本身份验证。像这样: https://example.com/api?param1=xxx&param2=yyy

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

现在的问题是,我可以使用 Amazon AWS API Gateway 来缓解这种情况吗?

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

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


解决方案路径:

我基于 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。

【问题讨论】:

    标签: api amazon-web-services


    【解决方案1】:

    您可以使用 AWS API Gateway 实现上述场景。但是,它不仅仅是一个代理集成,您还需要一个 Lambda 函数,该函数将通过执行转换来转发请求。

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

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

    【讨论】:

    • 这似乎是关于不存储密码的规则的一个例外,因为它不是存储用户的密码......它是用于访问第二个 API 的静态凭据。
    • @Michael-sqlbot 你的观点是有效的。我已经改进了包括这两种情况的答案。谢谢!
    • @Ashan 我用 Lambda 进行了尝试,并且部分成功。由于我是新手,我不知道如何相应地连接 API GW 和 Lambda。 (查看更新的问题)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-07
    • 2017-01-28
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多