调试 AWS HTTP API(测试版)JWT 授权方
Debugging AWS HTTP API (beta) JWT Authorizer
我正在试验 AWS Api Gateway's beta "HTTP API" 功能。
作为此实验的一部分,我正在尝试使用“JWT 授权方”授权访问 api:
https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-jwt-authorizer.html
文档指出,JWT 在被授权或被拒绝之前,将经历一个由 JWT 上的一系列 checks/verification 组成的工作流程。
没有授权者,端点是可访问的。通过授权方,我得到了 json:
的 401 响应
{"message":"Unauthorized"}
我正在尝试确定授权方在哪一步拒绝了 JWT。我已经为 api 端点设置了一个日志并看到了传入的请求,但它没有提供授权失败原因的见解。
有没有办法调试 why/where 授权方失败?
注意:这不是在谈论 lamda 授权者,我也没有使用 Cognito 生成 JWT。
401 表示无法建立用户身份验证。基本上,JWT 要么有问题,要么没有在 API 网关期望的 header 中提供请求。
另外,API 网关不是一个完整的服务器,所以无法调试 API 网关如何使用 JWT。虽然这可能令人失望,但请注意,它确实为您的后端提供了一个高度可扩展、可靠且廉价的 HTTP 端点,具有内置的基于 JWT 的身份验证支持,并且它刚刚在大多数地区可用。所以,我暂时不会把它划掉。
回到你的问题。虽然我不知道如何帮助调试部分。我可以告诉您我在不编写任何代码的情况下试验 JWT 授权程序所采取的步骤。
- 通过 https://mkjwk.org/ 创建了一个临时 JWK,它为您提供了一个 public 密钥和私人 + public 密钥对集,使用 kid您的选择和 RS256 算法
- 复制 public 密钥并将其插入您的 ISSUER_URL/.well-known/jwks.json。如果您不使用 Cognito,您可以将文件放在 S3 中进行实验(在这种情况下,您的 S3 存储桶 url 成为发行者 url)。如果使用 S3,您还需要创建 ISSUER_URL/.well_known/openid-configuration 文件并使这些文件 public 在实验期间仅可用。这些文件遵循您可以在线搜索的标准格式 (OIDC)。请注意,jwks.json 文件仅包含 public 密钥,因此即使其他人得到了也没有关系。
- 获取私有 + public 密钥对集并转到 https://8gwifi.org/jwkconvertfunctions.jsp 以获取单独的私有密钥和 public RSA pem 密钥
- 转到https://jwt.io/ and pick RS256 algo, kid header claim (using the same value used to generate the keys in the first step), aud claim in the payload (this should match the configuration you chose while setting JWT authorizer in HTTP API gateway), iss claim in the payload (this should match the ISSUER_URL), exp claim in the payload (expiry time of the JWT, you can use https://www.epochconverter.com/), nbf claim in the payload (just take the current timestamp from https://www.epochconverter.com/) 并且您从上一步获得的public 和私有RSA pem 密钥也将放置在它们相应的签名部分中。如果您在使用 HTTP API 网关
设置 JWT 授权方时设置授权范围,则还提供 scp 有效负载声明
完成所有这些后,我能够测试 API 网关能够与我生成的 JWT 一起工作。现在,我可以更有信心地编写这个东西了,幸运的是,JAVA、节点等工具已经可用。
看看回复。有一个名为 www-authenticate 的 header,如果身份验证失败,它包含一个错误响应。
即:
www-authenticate: Bearer scope="" error="invalid_token" error_description="JWKS communication error"
如果您使用 curl,您可以尝试使用 -v 来查看完整的响应,包括 header。
给遇到的人
the issuer in the OIDC discovery endpoint metadata does not match the configured issuer"
在 S3 上托管他们的 OpenId 配置和 JWK 文件时出错。
确保你使用
https://BUCKETNAME.s3.amazonaws.com/
而不是
https://BUCKETNAME.REGION.s3.amazonaws.com/
对于发行人字段。
我正在试验 AWS Api Gateway's beta "HTTP API" 功能。
作为此实验的一部分,我正在尝试使用“JWT 授权方”授权访问 api:
https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-jwt-authorizer.html
文档指出,JWT 在被授权或被拒绝之前,将经历一个由 JWT 上的一系列 checks/verification 组成的工作流程。
没有授权者,端点是可访问的。通过授权方,我得到了 json:
的 401 响应{"message":"Unauthorized"}
我正在尝试确定授权方在哪一步拒绝了 JWT。我已经为 api 端点设置了一个日志并看到了传入的请求,但它没有提供授权失败原因的见解。
有没有办法调试 why/where 授权方失败?
注意:这不是在谈论 lamda 授权者,我也没有使用 Cognito 生成 JWT。
401 表示无法建立用户身份验证。基本上,JWT 要么有问题,要么没有在 API 网关期望的 header 中提供请求。
另外,API 网关不是一个完整的服务器,所以无法调试 API 网关如何使用 JWT。虽然这可能令人失望,但请注意,它确实为您的后端提供了一个高度可扩展、可靠且廉价的 HTTP 端点,具有内置的基于 JWT 的身份验证支持,并且它刚刚在大多数地区可用。所以,我暂时不会把它划掉。
回到你的问题。虽然我不知道如何帮助调试部分。我可以告诉您我在不编写任何代码的情况下试验 JWT 授权程序所采取的步骤。
- 通过 https://mkjwk.org/ 创建了一个临时 JWK,它为您提供了一个 public 密钥和私人 + public 密钥对集,使用 kid您的选择和 RS256 算法
- 复制 public 密钥并将其插入您的 ISSUER_URL/.well-known/jwks.json。如果您不使用 Cognito,您可以将文件放在 S3 中进行实验(在这种情况下,您的 S3 存储桶 url 成为发行者 url)。如果使用 S3,您还需要创建 ISSUER_URL/.well_known/openid-configuration 文件并使这些文件 public 在实验期间仅可用。这些文件遵循您可以在线搜索的标准格式 (OIDC)。请注意,jwks.json 文件仅包含 public 密钥,因此即使其他人得到了也没有关系。
- 获取私有 + public 密钥对集并转到 https://8gwifi.org/jwkconvertfunctions.jsp 以获取单独的私有密钥和 public RSA pem 密钥
- 转到https://jwt.io/ and pick RS256 algo, kid header claim (using the same value used to generate the keys in the first step), aud claim in the payload (this should match the configuration you chose while setting JWT authorizer in HTTP API gateway), iss claim in the payload (this should match the ISSUER_URL), exp claim in the payload (expiry time of the JWT, you can use https://www.epochconverter.com/), nbf claim in the payload (just take the current timestamp from https://www.epochconverter.com/) 并且您从上一步获得的public 和私有RSA pem 密钥也将放置在它们相应的签名部分中。如果您在使用 HTTP API 网关 设置 JWT 授权方时设置授权范围,则还提供 scp 有效负载声明
完成所有这些后,我能够测试 API 网关能够与我生成的 JWT 一起工作。现在,我可以更有信心地编写这个东西了,幸运的是,JAVA、节点等工具已经可用。
看看回复。有一个名为 www-authenticate 的 header,如果身份验证失败,它包含一个错误响应。
即:
www-authenticate: Bearer scope="" error="invalid_token" error_description="JWKS communication error"
如果您使用 curl,您可以尝试使用 -v 来查看完整的响应,包括 header。
给遇到的人
the issuer in the OIDC discovery endpoint metadata does not match the configured issuer"
在 S3 上托管他们的 OpenId 配置和 JWK 文件时出错。
确保你使用
https://BUCKETNAME.s3.amazonaws.com/
而不是
https://BUCKETNAME.REGION.s3.amazonaws.com/
对于发行人字段。