【问题标题】:Debugging AWS HTTP API (beta) JWT Authorizer调试 AWS HTTP API (beta) JWT Authorizer
【发布时间】:2020-05-01 21:28:08
【问题描述】:

我正在试验AWS Api Gateway's beta "HTTP API" 功能。

作为此实验的一部分,我正在尝试使用“JWT Authorizer”授权对 api 的访问:

https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-jwt-authorizer.html

文档指出,JWT 在获得授权或被拒绝之前,将通过一系列检查/验证 JWT 的工作流程。

没有授权者,端点是可访问的。通过授权人,我得到一个带有 json 的 401 响应:

{"message":"Unauthorized"}

我正在尝试找出授权方拒绝 JWT 的步骤。我已经为 api 端点设置了一个日志,并看到了进来的请求,但它没有提供关于授权失败的原因。

有没有办法调试授权方失败的原因/位置?

注意:这里不是在讨论 lamda 授权者,我也不是使用 Cognito 来生成 JWT。

【问题讨论】:

  • 您能否使用 jwt.io 解码您的 JWT 令牌并验证有效负载是否正确且符合预期?
  • 有趣的是,我实际上使用 jwt.io 生成了令牌。令牌完全有可能包含不正确/缺失的字段,或者令牌内容与授权人设置不匹配。我目前的主要工作是确定是否可以进行调试。如果我无法深入了解问题所在,那么我不想继续使用亚马逊的网关,因为能够调试对我和我的团队来说非常重要。 (我目前正在评估 AWS API Gateway 作为我团队中使用的工具)
  • 我刚到了学习的同一个阶段。似乎一种选择是将所有传入的 [HTTP 请求] 路由到您进行手动调试的无人看守的 [lambda]。 (接下来可能会尝试。)

标签: amazon-web-services amazon-api-gateway


【解决方案1】:

对于遇到的人

OIDC 发现端点元数据中的颁发者与配置的颁发者不匹配”

在 S3 上托管他们的 OpenId 配置和 JWK 文件时出错。

确保你使用

https://BUCKETNAME.s3.amazonaws.com/

而不是

https://BUCKETNAME.REGION.s3.amazonaws.com/

对于颁发者字段。

【讨论】:

    【解决方案2】:

    查看响应。有一个名为 www-authenticate 的标头,其中包含一个错误响应,如果身份验证失败。

    即:

    www-authenticate: Bearer scope="" error="invalid_token" error_description="JWKS 通信错误"

    如果你使用 curl,你可以尝试使用 -v 来查看完整的响应,包括标题。

    【讨论】:

    • 谢谢!这给了我“OIDC 发现端点元数据中的颁发者与配置的颁发者不匹配”,所以我可以继续 :)
    【解决方案3】:

    401 表示无法建立用户的身份验证。基本上,JWT 要么有问题,要么没有在 API Gateway 期望的标头中提供请求。

    另外,API Gateway 不是一个成熟的服务器,所以不会调试 API Gateway 如何使用 JWT。虽然这可能很糟糕,但请注意,它确实为您的后端提供了一个高度可扩展、可靠且廉价的 HTTP 端点,并具有内置的基于 JWT 的身份验证支持,并且它刚刚在大多数地区可用。所以,我暂时不会把它划掉。

    回到你的问题。虽然我不知道如何帮助调试部分。我可以告诉你我在不编写任何代码的情况下尝试使用 JWT 授权器的步骤。

    1. 通过 https://mkjwk.org/ 创建了一个临时 JWK,它使用您选择的 kid 和 RS256 算法为您提供了一个公钥和私钥 + 公钥对集
    2. 复制公钥并将其插入您的 ISSUER_URL/.well-known/jwks.json。如果您不使用 Cognito,您可以将文件放在 S3 中进行实验(在这种情况下,您的 S3 存储桶 url 将成为颁发者 url)。如果使用 S3,您还需要创建 ISSUER_URL/.well_known/openid-configuration 文件,并使这些文件在实验期间公开可用。这些文件遵循您可以在线搜索的标准格式 (OIDC)。请注意,jwks.json 文件仅包含公钥,因此即使其他人得到它也没关系。
    3. 获取私钥 + 公钥对集并转到 https://8gwifi.org/jwkconvertfunctions.jsp 以获取单独的私钥和公钥 RSA pem 密钥
    4. 转到https://jwt.io/ 并选择 RS256 算法,kid 标头声明(使用与第一步中生成密钥相同的值),aud 在负载(这应该与您在 HTTP API 网关中设置 JWT 授权者时选择的配置相匹配),负载中的 iss 声明(这应该与 ISSUER_URL 相匹配),exp 中的声明有效载荷(JWT 的到期时间,您可以使用 https://www.epochconverter.com/),有效载荷中的 nbf 声明(只需从 https://www.epochconverter.com/ 获取当前时间戳)以及您的公共和私有 RSA pem 密钥从上一步得到的都放在他们对应的签名部分。如果您在使用 HTTP API 网关设置 JWT 授权方时设置了授权范围,还请提供 scp 有效负载声明

    完成所有这些之后,我能够测试 API 网关是否能够与我生成的 JWT 一起使用。现在,我可以更有信心地编写这个东西了,幸运的是,已经有 JAVA、node 等工具可用。

    【讨论】:

    • 感谢这个写得很好的答案。以后我会循环回到http api网关,我相信你的回答对我会有帮助,同时它会立即对其他人有所帮助。
    • 我陷入的一个陷阱是我没有在我的发行者中包含尾部斜杠。当您在 jwt.io 解码您的 JWT 令牌时,请确保颁发者完全匹配。这背后没有逻辑。它只是一个字符串。
    猜你喜欢
    • 2020-07-06
    • 2021-11-20
    • 2022-12-28
    • 2020-07-11
    • 2020-03-17
    • 2020-09-21
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多