2

嘿,我开始使用无服务器框架、apigateway、lambdas 和授权者。

这是我的问题:

  1. 为了验证正确的 JWT 令牌(这似乎是当今无服务器身份验证的最佳解决方案),我需要一个客户端 ID。由于授权者 lambda 不能(?)将请求的任何其他参数传递到 lambda 中,除了令牌本身,这是一项艰巨的任务。我怎样才能做到这一点?

  2. 由于每次经过身份验证的调用都会调用一个额外的 lambda,所以我的成本会翻倍?!可能是我在这里误解了一些东西,但在我看来,在不使用授权方的情况下实现一种验证我的令牌的方法更便宜,而且我不需要实现授权方 lambda 本身。

4

2 回答 2

0

使用AWS Cognito进行身份验证,这将允许您在应用程序之外使用身份验证,并且仍然能够让您的应用程序根据自定义角色或类似角色将用户划分为子组。

如果由于某种原因您不能使用 AWS Cognito(为什么不呢?),则既可以使用自定义身份验证(对于使用 SLS 的每个函数也一样),甚至可以使用每个 lambda 函数内的自定义代码进行身份验证。

我建议使用 Cognito,并且仅在您知道需要时才自定义。

于 2019-11-21T11:40:23.717 回答
0

OAuth2 的全部意义在于,在授权时,您不关心向您提供令牌的持有者是谁或他们正在使用哪个客户端(网络应用程序、邮递员等),只关心令牌对任何情况都有效令牌持有者正在尝试做的事情。您相信身份验证已经发生,因为令牌颁发者已经完成了身份验证。

当您谈论 JWT 中的 aud(audience)(来自评论)时,可能会或可能不会包含在 JWT 发行者中,这旨在反映 JWT 有效的服务或服务。

例如,这可以具有'myAPIName''myAPIName/test'或什至的值['myAPIName/test1', 'myAPIName/test2']

如果您需要验证单个 aud 声明,您有两个选择,您可以让不同的 Lambda 使用硬编码的 aud 变量授权不同的 api 路由和方法,或者您可以获取被调用的 api 的名称并将其映射回匹配的名称审计索赔。

例如,传入请求的方法 arn 可以在event.methodArn. 这看起来arn:aws:execute-api:{regionId}:{accountId}:{apiId}/{stage}/{httpVerb}/可能[{resource}/[{child-resources}]]取决于您的实现。通过一些字符串操作,您可以将其映射回受众声明的格式(无论您看起来如何)。

如果您希望使用 api 名称而不是 api 名称,则可以将 apigateway.getrestapi 方法用于您正在使用的任何 sdk。可以在此处找到有关此 JavaScript sdk 方法的文档。

JWT 可能有一个子(主题声明),再次取决于 JWT 发行者的实现,这可能与您的任何用户(或至少 JWT 发行者知道的用户)有关。除了检查 JWT 的签名之外验证这一点是没有意义的。您可以做的最好的事情是检查该用户是否存在,并且仅当您可以访问与 JWT 颁发者相同的用户数据库时。虽然这可以用来确保 UserA 只能访问 UserA 的数据。同样,您相信持有者拥有令牌这一事实证明他们已经过身份验证(证明他们是谁)。

我希望这能回答你问题的第一部分。

关于第 2 部分,与在目标 Lambda 中进行授权相比,使用 Lambda Authorizer 的优势在于缓存。

所以假设我有一个有效期为一小时的令牌,我每秒调用一次你的 API,持续 30 分钟(1,800 次调用)。您有一个响应缓存时间为 10 分钟的 Lambda 授权方。这意味着您检查 JWT 3 次以获得 1800 个 api 调用。

但是,如果您在目标 Lambda 中验证该令牌,您将进行 1,800 次处理。

于 2019-11-21T15:31:29.500 回答