使用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,提问作者Роман Коптев
相关产品推荐
相关产品推荐

