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

使用Amplify服务端登录后如何在客户端保留会话?

Amplify服务端登录后客户端保留会话的实现方案

核心结论

可以通过将服务端登录生成的认证令牌写入Cookie,再让客户端Amplify从Cookie中读取会话信息的方式实现需求,同时支持令牌自动刷新。

具体实现步骤

1. 服务端登录后写入Cookie

使用withSSRContext完成登录后,从返回的用户会话中提取idToken、accessToken、refreshToken等关键令牌,将它们以Cookie的形式返回给客户端。注意设置合适的Cookie属性保证安全性。

示例代码(服务端):

import { withSSRContext } from 'aws-amplify';

export async function loginHandler(req, res) {
  const { Auth } = withSSRContext({ req });
  try {
    const user = await Auth.signIn(username, password);
    const session = user.signInUserSession;
    
    // 将令牌写入Cookie
    res.setHeader('Set-Cookie', [
      `idToken=${session.idToken.jwtToken}; HttpOnly; Secure; SameSite=Strict; Path=/; Max-Age=${session.idToken.expiresIn}`,
      `accessToken=${session.accessToken.jwtToken}; HttpOnly; Secure; SameSite=Strict; Path=/; Max-Age=${session.accessToken.expiresIn}`,
      `refreshToken=${session.refreshToken.token}; HttpOnly; Secure; SameSite=Strict; Path=/; Max-Age=31536000`
    ]);
    
    res.status(200).json({ success: true });
  } catch (err) {
    res.status(401).json({ error: err.message });
  }
}

2. 客户端配置Amplify从Cookie读取会话

在客户端初始化Amplify时,配置Auth模块的storage选项,自定义一个从Cookie读取令牌的存储适配器,替代默认的LocalStorage。这样Amplify会自动从Cookie中获取会话信息,识别已登录用户。

示例代码(客户端):

import Amplify from 'aws-amplify';
import awsconfig from './aws-exports';

// 自定义Cookie存储适配器
const CookieStorage = {
  getItem: (key) => {
    const value = `; ${document.cookie}`;
    const parts = value.split(`; ${key}=`);
    if (parts.length === 2) return parts.pop().split(';').shift();
    return null;
  },
  setItem: () => {}, // 服务端已处理写入,客户端无需操作
  removeItem: (key) => {
    document.cookie = `${key}=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;`;
  },
  clear: () => {}
};

Amplify.configure({
  ...awsconfig,
  Auth: {
    ...awsconfig.Auth,
    storage: CookieStorage // 使用自定义Cookie存储
  }
});

3. 确保令牌自动刷新正常工作

Amplify的Auth模块会自动尝试使用refreshToken刷新令牌,只要客户端能正确读取refreshToken,且服务端Cognito配置允许刷新,就能实现自动刷新。需注意:

  • 确保refreshToken的Cookie有效期足够长
  • 客户端Amplify配置中的用户池信息与服务端完全一致
  • 若跨域或复杂SSR场景下刷新需要服务端参与,可在客户端拦截刷新请求,将refreshToken从Cookie取出后发送到服务端处理,再更新Cookie中的令牌

关键注意事项

  • Cookie安全属性:必须设置HttpOnly防止XSS攻击,Secure确保仅在HTTPS下传输,SameSite防止CSRF攻击
  • 令牌有效期:idToken和accessToken有效期较短(通常1小时),refreshToken有效期较长,需合理设置Cookie的Max-Age
  • 跨域场景:若客户端与服务端跨域,需配置Cookie的Domain属性,并确保服务端开启CORS支持带Cookie的请求

内容的提问来源于stack exchange,提问作者Роман Коптев

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 06:02:52