首页 > 解决方案 > Aws Lambda - 如何保留有效令牌以用于其他调用

问题描述

我已经使用 cognito 身份验证设置了 api 网关,但需要将一些请求传递给另一个具有自己身份验证的 rest 服务,您需要提供 clientID 和 secret 来接收有效期为几个小时的不记名令牌。

我不需要对请求进行任何更改,只需添加令牌并将其传递给其余服务并接收答案并将其传递给客户端。

由于令牌将在几个小时内有效,因此我不想在每次请求时都要求令牌以节省时间。

我可以在哪里保留有效令牌?Api 网关或 lambda 函数?Lambda 函数是无状态的,据我所知没有存储。

谢谢

标签: aws-lambdaaws-api-gateway

解决方案


有多种方法可以实现这一目标。我给你两个我认为对你的情况有意义的建议:

Lambda 实例中的缓存键

您可以在 Lambda 函数中缓存数据。这通常发生在 Lambda 处理函数之外的代码中(例如,对于 Node.js,处理函数之外的所有内容都在调用处理函数之前被初始化)。

是的,你说得对,Lambda 函数应该是无状态的。但是,函数实例正在被重用。因此,如果您确定您的 Lambda 函数仅用于这一目的(即缓存此类密钥是安全的)并且您可以使用相同的密钥调用外部端点一段时间,您可以通过缓存它来调整性能并仅在过期后立即更新。这样,您需要在第一次调用时检索密钥,并且只在每次调用同一函数实例时读取它。/tmp(或者,如果您不信任这种缓存机制,也可以将数据存储在一个文件中)我写了一篇关于在 AWS Lambda 中缓存的博客文章,其中更详细地解释了这种方法。如果您有任何问题,请告诉我。

优点:在代码中缓存相对容易。

在 Secrets Manager 中存储密钥

您可以将其“外包”给Secrets Manager ,而不是在同一个 Lambda 函数中检索和缓存密钥。这意味着,您在 Secrets Manager 中添加一个新的密钥/密钥,并附加一个单独的 Lambda 函数,在密钥过期前每隔几个小时轮换一次密钥。然后,在您的原始 Lambda 函数中,您只需从 Secrets Manager 中检索密钥。为了稍微优化 Lambda 成本和性能,我仍然建议如上所述将密钥缓存一段时间。

优点:关注点分离。


推荐阅读