AWS Cognito Lambda Authorizer-401未经授权的错误

时间:2019-08-05 05:16:51

标签: amazon-web-services aws-lambda amazon-cognito

我已经在AWS Cognito中创建了一个lambda授权者进行验证。

用户将登录请求发送到AWS Cognito,成功登录后将获得ID令牌。

我需要使用Lambda授权者提供不同的API集。

对于这些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被调用。 但是我没有看到lambda函数被调用,当我收到401时,出现未经授权的错误。

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

1 个答案:

答案 0 :(得分:0)

通过在API网关中将Lambda授权者的TTL值设置为0,可以解决此问题。

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

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

但是如果调用了其他API,则访问将被拒绝,因为仅第一种方法才允许访问。

我找到了以下有用的链接-

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