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

Strapi v5 对接Next.js前端Google Auth报错:Grant: missing session or misconfigured provider

Strapi v5 跨域场景下Next.js Google OAuth认证正确配置方案

1. 修正Google Provider的重定向URI配置

  • Strapi端:在Users & Permissions插件的Google provider设置中,Redirect URI必须填写前端的回调路由地址(而非Strapi的/admin),例如开发环境填 http://localhost:3000/api/auth/callback/google,生产环境填对应域名的回调地址。
  • Google Cloud Console端:进入OAuth 2.0客户端ID配置页面,将上述前端回调地址添加到「已授权的重定向URI」列表,确保与Strapi配置完全一致。

2. 配置Strapi跨域(CORS)规则

修改Strapi项目的 config/middlewares.js,开启跨域凭证支持并允许前端域名:

export default [
  // 保留其他默认中间件
  {
    name: 'strapi::cors',
    config: {
      origin: ['http://localhost:3000', 'https://your-production-frontend.com'], // 替换为你的前端域名
      methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'],
      headers: '*',
      credentials: true, // 跨域场景必须开启,用于传递session/cookie
    },
  },
  // 保留其他默认中间件
];

3. 修复Strapi Session配置(解决missing session错误)

修改Strapi项目的 config/server.js,配置跨域兼容的session cookie:

export default ({ env }) => ({
  // 保留其他服务器配置
  session: {
    cookie: {
      secure: env('NODE_ENV') === 'production', // 生产环境需开启HTTPS
      sameSite: 'none', // 跨域场景必须设为none,配合secure=true(生产环境)
      domain: env('SESSION_DOMAIN', '.your-domain.com'), // 主域名,适配前后端子域名跨域(如api.your-domain.com和app.your-domain.com)
    },
  },
});

开发环境注意:若使用localhost,浏览器可能限制sameSite: none+secure: false的cookie,可临时在Chrome浏览器开启chrome://flags/#allow-insecure-localhost绕过限制。

4. 前端Next.js回调路由处理

在Next.js中创建回调路由(如 app/api/auth/callback/google/route.js),处理Strapi返回的授权码并获取用户token:

import { NextResponse } from 'next/server';

export async function GET(request) {
  const { searchParams } = new URL(request.url);
  const code = searchParams.get('code');

  if (!code) {
    return NextResponse.redirect(new URL('/login?error=missing_code', request.url));
  }

  // 调用Strapi的回调接口获取JWT
  const strapiRes = await fetch(
    `${process.env.NEXT_PUBLIC_STRAPI_URL}/api/connect/google/callback?code=${code}`,
    { credentials: 'include' } // 保持跨域session
  );

  const authData = await strapiRes.json();

  if (authData.jwt) {
    // 将JWT存入cookie,跳转到首页
    const response = NextResponse.redirect(new URL('/', request.url));
    response.cookies.set('strapi_jwt', authData.jwt, {
      httpOnly: true,
      secure: process.env.NODE_ENV === 'production',
      sameSite: 'none',
      domain: '.your-domain.com',
      maxAge: 30 * 24 * 60 * 60, // 30天有效期
    });
    return response;
  }

  return NextResponse.redirect(new URL('/login?error=auth_failed', request.url));
}

5. 验证Provider基础配置

  • 确认Strapi的Google provider中Client ID和Client Secret与Google Cloud Console完全一致。
  • 检查Scopes配置,至少包含 openid email profile,确保能获取用户基础信息。

内容的提问来源于stack exchange,提问作者Duty First

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 01:40:22