如何在Next.js API路由中从代理响应获取并设置Refresh Token?
解决Next.js API路由代理中获取响应并设置Refresh Token的问题
要实现从代理的API服务器响应中提取Refresh Token并设置到Cookie,你需要修改代理配置并接管响应处理流程,具体操作如下:
关键修改点
- 启用自定义响应处理,让你能拦截API服务器的返回数据
- 监听代理响应事件,解析并提取Refresh Token
- 设置Cookie后再将响应转发给客户端
修改后的完整代码
import httpProxyMiddleware from 'next-http-proxy-middleware'; import { parseCookies } from 'nookies'; import concat from 'concat-stream'; // 需先安装:npm install concat-stream export const config = { api: { externalResolver: true, bodyParser: false, }, }; const handler = async (req, res) => { const cookies = parseCookies({ req }); if (req.headers.cookie && cookies) { req.headers.Authorization = `Bearer ${cookies['access_token']}`; } return httpProxyMiddleware(req, res, { target: "http://api.my-server-api.com", ws: true, secure: process.env.NODE_ENV === 'production', selfHandleResponse: true, // 开启自定义响应处理,必须设为true changeOrigin: true, headers: { cookie: '', // 移除客户端传入的cookie }, onProxyRes: (proxyRes, req, res) => { // 收集代理响应的流式数据 proxyRes.pipe(concat((data) => { try { // 解析API返回的JSON响应体 const responseBody = JSON.parse(data.toString()); // 检查响应中是否存在refresh_token if (responseBody.refresh_token) { // 设置Refresh Token到Cookie,按需配置安全属性 res.setHeader('Set-Cookie', [ `refresh_token=${responseBody.refresh_token}; HttpOnly; Secure=${process.env.NODE_ENV === 'production'}; Path=/; Max-Age=2592000` ]); } } catch (err) { // 若响应非JSON格式,跳过解析逻辑 console.error('解析响应体失败:', err); } // 转发原始响应的状态码和头信息 res.writeHead(proxyRes.statusCode, proxyRes.headers); // 转发处理后的响应体给客户端 res.end(data); })); }, }); }; export default handler;
注意事项
- Cookie属性配置:
HttpOnly可防止XSS攻击窃取Token,Secure仅在HTTPS环境下生效(生产环境建议开启),Max-Age设置Token有效期(示例为30天)。 - 响应格式兼容:如果API返回非JSON格式,需调整解析逻辑(如直接读取文本)。
- 依赖安装:需要安装
concat-stream来处理流式响应数据,执行npm install concat-stream完成安装。
内容的提问来源于stack exchange,提问作者Epple
相关产品推荐
相关产品推荐

