Ory Hydra直接重定向报错:会话Cookie无CSRF值,求助
解决Ory Hydra自定义登录端点直接重定向的CSRF错误
问题背景
基于Ory Hydra(本地Docker)、Next.js和Next Auth搭建的系统,自定义登录端点中调用Hydra接口后直接重定向时,收到错误:The request is not allowed. No CSRF value available in the session cookie.,但返回重定向链接由客户端跳转则正常。
核心原因
Hydra的登录授权流程依赖会话Cookie存储CSRF令牌:
- 调用
getOAuth2LoginRequest时,Hydra会返回包含CSRF信息的Set-Cookie头 - 后端直接重定向时,如果没有将这些Cookie传递回客户端,浏览器无法携带CSRF令牌发起后续授权请求
- 客户端跳转时,之前的请求已将Cookie存入浏览器,因此能正常传递令牌
解决方案
在Next.js API路由中,需要完成两个关键操作:
- 将客户端请求的Cookie传递给Hydra接口,确保会话关联
- 将Hydra返回的
Set-Cookie设置回客户端响应,让浏览器持有CSRF令牌
修改后的代码示例
import { Configuration, PublicApi } from '@ory/client'; const oidc = new PublicApi(new Configuration({ basePath: 'http://localhost:4444' })); export default async function handler(req, res) { const { loginChallenge } = req.query; if (!loginChallenge) { return res.status(400).json({ error: 'Missing login challenge' }); } // 获取客户端请求中的Cookie const clientCookies = req.headers.cookie || ''; try { // 传递客户端Cookie调用Hydra获取登录请求 await oidc.getOAuth2LoginRequest( { loginChallenge }, { headers: { Cookie: clientCookies } } ); // 接受登录请求,传递Cookie并获取完整响应(包含Set-Cookie) const acceptResponse = await oidc.acceptOAuth2LoginRequest( { loginChallenge, acceptOAuth2LoginRequest: { subject: 'Roy', remember: false, remember_for: 3600, acr: '0' } }, { headers: { Cookie: clientCookies }, responseType: 'full' // 需设置此参数获取完整响应头 } ); // 将Hydra返回的Set-Cookie设置到响应中 if (acceptResponse.headers['set-cookie']) { acceptResponse.headers['set-cookie'].forEach(cookie => { res.setHeader('Set-Cookie', cookie); }); } // 执行重定向 return res.redirect(acceptResponse.data.redirect_to); } catch (error) { return res.status(error.response?.status || 500).json({ error: error.response?.data || 'Internal server error' }); } }
额外注意事项
- 确保本地Docker环境中Hydra的
COOKIE_DOMAIN配置为localhost(与Next.js域名一致),避免Cookie跨域问题 - 检查Hydra的
COOKIE_SECURE配置,本地开发时需设置为false(仅HTTP协议也能设置Cookie) - Next.js API路由默认不会自动转发Cookie,必须手动传递和设置
内容的提问来源于stack exchange,提问作者Roy Scheeren
相关产品推荐
相关产品推荐

