Python3.9中AWS Cognito Post认证Lambda触发器返回NotAuthorizedException方法
在AWS Cognito中通过Post Authentication Lambda拦截软删除用户登录
问题原因
你遇到的Unrecognizable lambda output和InvalidLambdaResponseException错误,是因为返回了不符合Cognito Lambda触发器要求的HTTP响应格式。Cognito的Post Authentication触发器要求返回特定结构的JSON对象,而非标准HTTP响应。
实现步骤与代码示例
- 提取用户自定义状态字段:从Lambda事件中获取用户的自定义属性(比如你标记的软删除字段)。
- 判断用户是否已软删除:检查该字段值是否匹配你定义的已删除状态(例如
"true")。 - 返回合规的拒绝响应:如果用户已删除,返回包含
response.failAuthentication: true的结构,Cognito会自动拒绝登录,且错误提示和拒绝未识别用户的效果一致。
以下是Python 3.9的实现代码:
import json def lambda_handler(event, context): # 从事件中获取用户自定义属性 user_attributes = event.get('request', {}).get('userAttributes', {}) # 替换为你实际使用的自定义字段名,比如custom:isDeleted is_deleted = user_attributes.get('custom:isDeleted', 'false').lower() if is_deleted == 'true': # 返回符合Cognito要求的拒绝登录响应 return { "response": { "failAuthentication": True, "message": "Incorrect username or password." # 和未识别用户的错误提示保持一致 } } # 用户未被软删除,正常放行 return { "response": {} }
关键说明
- 必须返回包含
response键的对象:这是Cognito Lambda触发器的强制格式要求,否则会触发识别错误。 failAuthentication: True:明确告知Cognito拒绝此次登录请求。- 统一错误提示:
message字段设置为和未识别用户相同的内容,让前端无法区分用户是不存在还是已被软删除。
内容的提问来源于stack exchange,提问作者JustANoob
相关产品推荐
相关产品推荐

