【问题标题】:Serverless AWS - is it worth using custom authorizers (as a lambda)?无服务器 AWS - 是否值得使用自定义授权器(作为 lambda)?
【发布时间】:2020-03-16 00:22:04
【问题描述】:

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

这里是我的问题:

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

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

【问题讨论】:

  • 客户 ID 到底是什么意思?客户的id,还是API的id?
  • 关于问题的第二部分 - 这个博客 alexdebrie.com/posts/lambda-custom-authorizers 很好地总结了自定义授权者的优缺点
  • @KMo 用于验证选项,您应该输入受众,恕我直言,类似于客户 ID
  • 过度简化,但客户端 ID 表示请求令牌的事物。通常是提示或重定向您提供用户名和密码以获取 jwt 的网站。 aud(受众)是旨在使用该 jwt 的服务。 IE。你想用的东西。
  • @andre 我仍在努力理解您问题的第一部分。您认为您需要授权请求的 JWT 中缺少什么?

标签: amazon-web-services jwt serverless-framework lambda-authorizer


【解决方案1】:

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

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

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

【讨论】:

  • 您是否尝试过从 cognito 导出用户?这就是我不想使用它的原因。
【解决方案2】:

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

当您谈论 JWT 中的 aud(audience)(来自 cmets)时,它可能包含也可能不包含,具体取决于 JWT 颁发者,这旨在反映 JWT 对其有效的服务或服务。

这可能具有例如'myAPIName''myAPIName/test' 甚至['myAPIName/test1', 'myAPIName/test2'] 的值。

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

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

如果您更愿意使用 api 名称而不是 api 名称,您可以将 apigateway.getrestapi 方法用于您正在使用的任何 sdk。可以在 here 找到有关此 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-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-28
    • 2019-05-01
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    相关资源
    最近更新 更多