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 次处理。