import { toast } from '../main' import { setToken, loadCurrentUser } from './auth' import { registerPush } from './push' export async function googleGetIdToken() { const config = useRuntimeConfig() const GOOGLE_CLIENT_ID = config.public.googleClientId return new Promise((resolve, reject) => { if (!window.google || !GOOGLE_CLIENT_ID) { toast.error('Google 登录不可用, 请检查网络设置与VPN') reject() return } window.google.accounts.id.initialize({ client_id: GOOGLE_CLIENT_ID, callback: ({ credential }) => resolve(credential), use_fedcm: true, }) window.google.accounts.id.prompt() }) } export function googleAuthorize() { const config = useRuntimeConfig() const GOOGLE_CLIENT_ID = config.public.googleClientId if (!GOOGLE_CLIENT_ID) { toast.error('Google 登录不可用, 请检查网络设置与VPN') return } const redirectUri = `${WEBSITE_BASE_URL}/google-callback` const nonce = Math.random().toString(36).substring(2) const url = `https://accounts.google.com/o/oauth2/v2/auth?client_id=${GOOGLE_CLIENT_ID}&redirect_uri=${encodeURIComponent(redirectUri)}&response_type=id_token&scope=openid%20email%20profile&nonce=${nonce}` window.location.href = url } export async function googleAuthWithToken(idToken, redirect_success, redirect_not_approved) { try { const config = useRuntimeConfig() const API_BASE_URL = config.public.apiBaseUrl const res = await fetch(`${API_BASE_URL}/api/auth/google`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ idToken }), }) const data = await res.json() if (res.ok && data.token) { setToken(data.token) await loadCurrentUser() toast.success('登录成功') registerPush() if (redirect_success) redirect_success() } else if (data.reason_code === 'NOT_APPROVED') { toast.info('当前为注册审核模式,请填写注册理由') if (redirect_not_approved) redirect_not_approved(data.token) } else if (data.reason_code === 'IS_APPROVING') { toast.info('您的注册理由正在审批中') if (redirect_success) redirect_success() } } catch (e) { toast.error('登录失败') } } export async function googleSignIn(redirect_success, redirect_not_approved) { try { const token = await googleGetIdToken() await googleAuthWithToken(token, redirect_success, redirect_not_approved) } catch { /* ignore */ } } export function loginWithGoogle() { googleSignIn( () => { navigateTo('/', { replace: true }) }, (token) => { navigateTo(`/signup-reason?token=${token}`, { replace: true }) }, ) }