首页 > 解决方案 > AWS Cognito Lambda 授权方 - 401 未经授权的错误

问题描述

我在 AWS Cognito 中创建了一个用于验证的 lambda 授权器。

用户向 AWS Cognito 发送登录请求,并在成功登录后获取 ID 令牌。

有不同的 API 集,我需要使用 Lambda 授权器。

对于这些 API 请求,用户将 ID 令牌作为授权标头传递,并将用户池 ID 作为路径参数传递。

在我的自定义 lambda 函数中,我验证了这个 ID 令牌(JWT 令牌)

调用 lambda 函数时,它通过调用 URL 获取此用户池的 AWS Cognito 公钥

https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/jwks.json

我解析这个 JSON 并将来自这个公钥的孩子与来自用户传递的 ID 令牌的孩子在授权标头中进行比较。

下一步是,我检查令牌是否过期。

如果两项检查都通过了,我允许用户调用 API。

我面临的问题是,这个 lambda 授权器会定期失败。

如果我通过传递 ID 令牌调用第一个 API,它就可以工作。如果我一次又一次地调用相同的 API,它就可以工作。但是,如果我调用使用相同 Lambda 授权方的不同 API,它会失败。我收到“401 未经授权”错误。

我检查了 CloudWatch 日志,我可以看到当 lambda 授权器成功时调用了 Lambda。但是当我收到 401 未经授权的错误时,我没有看到 lambda 函数被调用。

我不确定这个问题是否与 lambda 调用有关,或者是因为我正在为每个调用获取 Cognito 公钥。

标签: amazon-web-servicesaws-lambdaamazon-cognito

解决方案


此问题已通过将 lambda 授权方的 API 网关中的 TTL 值设置为 0 来解决。

在 Lambda 授权方代码中,允许对特定方法 ARN 进行访问。

API 网关正在缓存响应。下次如果调用相同的API,则调用成功。

但是,如果调用了不同的 API,访问将被拒绝,因为仅允许第一种方法访问。

我发现以下有用的链接 -

https://forums.aws.amazon.com/thread.jspa?threadID=225934


推荐阅读