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
相关产品推荐
相关产品推荐

