updates google login

This commit is contained in:
Zixin Zhou 2025-09-22 11:58:10 +08:00
parent f019c2bd34
commit 81f92215c5
2 changed files with 26 additions and 10 deletions

View File

@ -86,4 +86,5 @@ export interface OAuthState {
state: string; state: string;
timestamp: number; timestamp: number;
redirectUrl?: string; redirectUrl?: string;
inviteCode?: string;
} }

View File

@ -232,13 +232,23 @@ export const initializeGoogleGSI = (): Promise<void> => {
*/ */
export const signInWithGoogle = async (inviteCode?: string): Promise<void> => { export const signInWithGoogle = async (inviteCode?: string): Promise<void> => {
try { try {
console.log('开始Google登录流程Medium风格...'); console.log('开始Google登录流程使用环境变量配置...');
// 从环境变量获取配置(临时硬编码确保正确)
const clientId = process.env.NEXT_PUBLIC_GOOGLE_CLIENT_ID || '847079918888-o1nne8d3ij80dn20qurivo987pv07225.apps.googleusercontent.com';
const redirectUri = process.env.NEXT_PUBLIC_GOOGLE_REDIRECT_URI || 'https://www.movieflow.net/api/auth/google/callback';
// 根据当前域名选择正确的redirect_uri
const isLocalhost = window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1';
const actualRedirectUri = isLocalhost
? 'http://localhost:3000/api/auth/google/callback' // 本地开发
: redirectUri; // 使用环境变量配置
// 生成随机nonce用于安全验证 // 生成随机nonce用于安全验证
const nonce = Array.from(crypto.getRandomValues(new Uint8Array(32))) const nonce = Array.from(crypto.getRandomValues(new Uint8Array(32)))
.map(b => b.toString(16).padStart(2, '0')).join(''); .map(b => b.toString(16).padStart(2, '0')).join('');
// 构建state参数 // 构建state参数(包含邀请码等信息)
const stateData = { const stateData = {
inviteCode: inviteCode || '', inviteCode: inviteCode || '',
timestamp: Date.now(), timestamp: Date.now(),
@ -246,17 +256,20 @@ export const signInWithGoogle = async (inviteCode?: string): Promise<void> => {
nonce: nonce nonce: nonce
}; };
// 根据环境变量确定redirect_uri console.log('使用的配置:', {
const redirectUri = process.env.NEXT_PUBLIC_GOOGLE_REDIRECT_URI || 'https://www.movieflow.ai/api/auth/google/callback'; clientId,
redirectUri,
console.log('使用的redirect_uri:', redirectUri); actualRedirectUri,
envClientId: process.env.NEXT_PUBLIC_GOOGLE_CLIENT_ID,
envRedirectUri: process.env.NEXT_PUBLIC_GOOGLE_REDIRECT_URI
});
// 构建Google OAuth2授权URLMedium风格参数 // 构建Google OAuth2授权URL
const authParams = new URLSearchParams({ const authParams = new URLSearchParams({
access_type: 'online', access_type: 'online',
client_id: GOOGLE_CLIENT_ID, client_id: clientId,
nonce: nonce, nonce: nonce,
redirect_uri: redirectUri, redirect_uri: actualRedirectUri, // 使用强制修复的URI
response_type: 'code', // 使用授权码模式 response_type: 'code', // 使用授权码模式
scope: 'email openid profile', scope: 'email openid profile',
state: JSON.stringify(stateData), state: JSON.stringify(stateData),
@ -266,6 +279,8 @@ export const signInWithGoogle = async (inviteCode?: string): Promise<void> => {
const authUrl = `https://accounts.google.com/o/oauth2/v2/auth?${authParams.toString()}`; const authUrl = `https://accounts.google.com/o/oauth2/v2/auth?${authParams.toString()}`;
console.log('跳转到Google授权页面:', authUrl); console.log('跳转到Google授权页面:', authUrl);
console.log('🔍 调试信息 - 授权URL中的redirect_uri:', authParams.get('redirect_uri'));
console.log('🔍 调试信息 - 当前页面域名:', window.location.origin);
// 保存state到sessionStorage用于验证 // 保存state到sessionStorage用于验证
sessionStorage.setItem('google_oauth_state', JSON.stringify({ sessionStorage.setItem('google_oauth_state', JSON.stringify({
@ -274,7 +289,7 @@ export const signInWithGoogle = async (inviteCode?: string): Promise<void> => {
inviteCode: inviteCode || '' inviteCode: inviteCode || ''
})); }));
// 直接在当前页面跳转到Google (Medium风格) // 直接在当前页面跳转到Google
window.location.href = authUrl; window.location.href = authUrl;
} catch (error) { } catch (error) {