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

Serverless Offline插件本地环境Cookie失效问题求助

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 07:25:19