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

如何在Next.js API路由中从代理响应获取并设置Refresh Token?

解决Next.js API路由代理中获取响应并设置Refresh Token的问题

要实现从代理的API服务器响应中提取Refresh Token并设置到Cookie,你需要修改代理配置并接管响应处理流程,具体操作如下:

关键修改点

  1. 启用自定义响应处理,让你能拦截API服务器的返回数据
  2. 监听代理响应事件,解析并提取Refresh Token
  3. 设置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 10:55:14