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

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路由中,需要完成两个关键操作:

  1. 将客户端请求的Cookie传递给Hydra接口,确保会话关联
  2. 将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 01:51:12