You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在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:

  1. 前端传递Origin到Cognito
    调用Cognito登录/注册SDK时,通过clientMetadata参数携带当前页面的Origin:
// 以Amplify SDK为例
Auth.signIn({
  username: userEmail,
  password: userPassword,
  clientMetadata: {
    origin: window.location.origin
  }
});
  1. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 10:52:06