我已经在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公钥。
答案 0 :(得分:0)
通过在API网关中将Lambda授权者的TTL值设置为0,可以解决此问题。
在Lambda授权者代码中,允许对特定方法ARN进行访问。
API网关正在缓存响应。下次如果调用相同的API,则调用成功。
但是如果调用了其他API,则访问将被拒绝,因为仅第一种方法才允许访问。
我找到了以下有用的链接-