AWS Cognito设置Cookie到自身域名而非目标域名的问题求助
方案1:改用OAuth授权码模式,不依赖Cookie
放弃依赖Cognito的会话Cookie,改用授权码(code)模式获取令牌,通过请求头携带认证信息:
- 配置Cognito应用客户端,将OAuth响应类型设为
code,回调URL设置为你的主域名(如https://mywebsite.com/callback) - 前端引导用户跳转至Cognito登录页,授权完成后Cognito会将授权码返回至回调URL
- 前端调用Cognito令牌端点
https://auth.mywebsite.com/oauth2/token,用授权码换取access_token和id_token - 后续向CloudFront发起的请求,在
Authorization头中携带Bearer <token>,CloudFront可通过Lambda@Edge或WAF验证令牌有效性
方案2:通过Lambda@Edge修改Cookie域
利用CloudFront的Lambda@Edge在响应阶段改写Cognito设置的Cookie域,使其作用于主域名的泛域:
- 在CloudFront中创建一个Lambda@Edge函数(需部署至us-east-1区域),绑定到查看器响应触发器
- 函数逻辑:当请求路径匹配Cognito回调路径时,遍历响应头的
Set-Cookie字段,将域从auth.mywebsite.com替换为.mywebsite.com,同时确保Cookie的Secure属性设为true,SameSite设为Lax或None(根据跨域场景调整) - 示例函数代码片段:
exports.handler = (event, context, callback) => { const response = event.Records[0].cf.response; const headers = response.headers; if (headers['set-cookie']) { headers['set-cookie'] = headers['set-cookie'].map(cookie => { return cookie.replace(/domain=auth\.mywebsite\.com/, 'domain=.mywebsite.com') .replace(/SameSite=Strict/, 'SameSite=Lax') .concat('; Secure'); }); } callback(null, response); };
- 注意:此方案仅适用于Cognito返回的会话Cookie,需确保CloudFront能处理回调请求的响应
关键注意事项
- 所有场景必须启用HTTPS,否则
Secure属性的Cookie无法跨域携带 - 使用泛域名Cookie(
.mywebsite.com)时,需注意子域的安全风险,避免敏感Cookie被其他子域读取 - Lambda@Edge函数需具备CloudFront调用权限,且代码需符合边缘计算的资源限制
内容的提问来源于stack exchange,提问作者Danny Ellis Jr.
相关产品推荐
相关产品推荐

