能否在Lambda预认证中获取Header Origin以保护User Pool ID?
如何通过限制域名保护Cognito User Pool ID
核心结论
Cognito本身提供了内置的域名限制功能,无需额外编写Lambda;若需自定义校验逻辑,也可通过前端传递Origin信息到Lambda触发器处理。
方案一:使用Cognito官方的Allowed Origins设置(优先推荐)
你可能遗漏了Cognito内置的Origin校验功能,直接配置允许的域名即可自动拦截非法请求:
- 打开Cognito控制台,进入目标User Pool
- 切换到「App integration」→「App clients and analytics」
- 选择需要配置的App Client,点击「Edit」
- 在「App client settings」或「Hosted UI」区域找到「Allowed Origins」(不同控制台版本位置略有差异)
- 填入允许访问的域名(比如
https://your-official-site.com),保存后Cognito会自动校验请求的Origin头,不符合的直接拒绝。
方案二:通过Lambda触发器自定义校验(复杂场景)
如果需要更灵活的校验逻辑(比如动态判断允许的域名),可以通过前端传递Origin信息到Lambda:
- 前端传递Origin到Cognito
调用Cognito登录/注册SDK时,通过clientMetadata参数携带当前页面的Origin:
// 以Amplify SDK为例 Auth.signIn({ username: userEmail, password: userPassword, clientMetadata: { origin: window.location.origin } });
- Lambda中获取并校验Origin
在Pre Authentication(登录前)或Pre Sign-up(注册前)触发器中,从事件对象的request.clientMetadata里提取Origin,然后校验:
def lambda_handler(event, context): # 从客户端元数据中获取传递的Origin incoming_origin = event.get('request', {}).get('clientMetadata', {}).get('origin') # 定义合法域名列表 allowed_origins = ['https://your-official-site.com', 'https://dev.your-site.com'] # 校验不通过则抛出错误,终止流程 if not incoming_origin or incoming_origin not in allowed_origins: raise Exception("Invalid request origin") # 校验通过,返回事件继续执行登录/注册流程 return event
注意事项
- 客户端元数据是前端主动传递的,存在被篡改的可能,建议配合方案一的官方限制使用,或添加额外的签名校验。
- Cognito的原生触发器事件不会直接携带原始请求的Origin头,必须通过前端主动传递。
内容的提问来源于stack exchange,提问作者Geralt
相关产品推荐
相关产品推荐

