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



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

作为此实验的一部分,我尝试使用"JWT 授权方"授权访问 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。

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

此外,API 网关不是一个成熟的服务器,因此无法调试 API 网关如何使用 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 配置文件,并使这些文件在实验期间公开可用。这些文件遵循标准格式(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等工具已经可用。

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

即:

www-authenticate:持有者范围=" 错误="invalid_token" error_description="JWKS 通信错误">

如果使用 curl,则可以尝试使用 -v 查看包括标头在内的完整响应。

对于那些遇到的人

OIDC 发现终端节点元数据中的颁发者与配置的颁发者不匹配">

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

确保使用

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

而不是

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

对于"颁发者"字段。

最新更新