4

我正在试验AWS Api Gateway 的测试版“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。

4

3 回答 3

3

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

IE:

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

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

于 2020-04-07T16:43:32.813 回答
3

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、node 等工具可用。

于 2020-03-26T04:25:45.327 回答
1

对于遇到的人

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

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

确保你使用

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

代替

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

对于发行人字段。

于 2020-09-10T13:58:48.620 回答