Serverless Offline插件本地环境Cookie失效问题求助
问题场景
部署到AWS后Cookie功能正常,但本地使用Serverless Offline插件时,Cookie无法生效。采用Lambda集成方式,现有配置及代码如下:
serverless.yml 配置
login: handler: functions/auth/login.handler events: - http: path: login method: post cors: true integration: lambda response: headers: Set-Cookie: integration.response.body.body statusCodes: 200: pattern: '' # Default response method 400: pattern: '.*"statusCode": 400,.*' template: $input.path("$.errorMessage") 401: pattern: '.*"statusCode": 401,.*' template: $input.path("$.errorMessage") 500: pattern: '.*"statusCode": 500,.*' template: $input.path("$.errorMessage")
Lambda函数代码
import { ok, internalServerError, unAuthorized } from '../../lib/response.js'; import { login } from '../../lib/token.js'; import { logger } from '../../lib/logger.js'; import { authLambda } from '../../constants/constant.js'; export const handler = async (event) => { logger.info('START', authLambda.login); let responseObject; let date = new Date(); date.setTime(+ date + (86400000)); // 24h try { const token = await login(event.body); if (token) { let cookie = 'auth='+token responseObject = ok(cookie); } else { responseObject = unAuthorized(); } logger.info('END => ', authLambda.login, responseObject); return responseObject; } catch (e) { logger.error('ERROR', authLambda.login, e); return new Error(internalServerError(e)); } };
原因分析
Serverless Offline对Lambda集成的响应模板解析逻辑与AWS原生API Gateway存在差异,默认配置下无法正确识别并输出Set-Cookie头;同时CORS配置未明确允许凭证(credentials),导致前端无法接收Cookie。
解决方案
1. 调整CORS配置
修改serverless.yml中的CORS设置,添加allowCredentials: true,确保服务器允许前端携带凭证:
cors: origin: '*' # 建议替换为实际前端域名,如http://localhost:3000 allowCredentials: true
2. 创建自定义Velocity响应模板
在项目根目录新建templates文件夹,创建response.vm文件,内容如下:
#set($context.responseOverride.header.Set-Cookie = $input.path('$.body')) $input.path('$.body')
该模板会明确将Lambda返回的body内容设置为Set-Cookie头的值,同时输出响应内容。
3. 更新serverless.yml的响应配置
修改login事件的response.statusCodes.200配置,指定自定义模板路径:
response: headers: Set-Cookie: integration.response.body.body statusCodes: 200: pattern: '' templatePath: templates/response.vm 400: pattern: '.*"statusCode": 400,.*' template: $input.path("$.errorMessage") 401: pattern: '.*"statusCode": 401,.*' template: $input.path("$.errorMessage") 500: pattern: '.*"statusCode": 500,.*' template: $input.path("$.errorMessage")
4. 重启Serverless Offline
停止当前本地服务,重新执行serverless offline start,测试登录接口即可看到Cookie正常生效。
内容的提问来源于stack exchange,提问作者17J4CK
相关产品推荐
相关产品推荐

