调试 AWS HTTP API(测试版)JWT 授权程序

Jam*_*ath 5 amazon-web-services aws-api-gateway

我正在试验AWS Api Gateway 的测试版“HTTP API”功能。

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

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

该文档指出,在授权或拒绝 JWT 之前,JWT 将经历一个工作流程,其中包括对 JWT 进行一系列检查/验证。

无需授权者即可访问端点。通过授权者,我收到带有 json 的 401 响应:

{"message":"Unauthorized"}
Run Code Online (Sandbox Code Playgroud)

我正在尝试找出授权者在哪一步拒绝 JWT。我已经为 api 端点设置了日志并看到了传入的请求,但它没有提供有关授权失败原因的见解。

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

注意:这不是在谈论 lamda 授权者,我也没有使用 Cognito 生成 JWT。

Ash*_*oel 6

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

此外,API Gateway 不是一个完整的服务器,因此无法调试 API gateway 如何使用 JWT。虽然这可能令人失望,但请注意,它确实为您的后端提供了一个高度可扩展、可靠且廉价的 HTTP 端点,并具有内置的基于 JWT 的身份验证支持,而且它刚刚在大多数地区可用。所以,我现在还不会划掉它。

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

  1. 通过https://mkjwk.org/创建了一个临时 JWK ,它使用您选择的孩子和 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声明(这应该与您在设置 JWT 时选择的配置匹配) HTTP API 网关中的授权者)、有效负载中的iss声明(应与 ISSUER_URL 匹配)、有效负载中的exp声明(JWT 的到期时间,您可以使用https://www.epochconverter.com/)、nbf声明有效负载(只需从https://www.epochconverter.com/获取当前时间戳)以及从上一步获得的公共和私有 RSA pem 密钥都将放置在相应的签名部分中。如果您在使用 HTTP API 网关设置 JWT 授权方时设置授权范围,还需提供scp有效负载声明

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