123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- export function useGoogleLogin() {
- const loading = ref(false)
- const clientID = '686587510116-r0soonrdftkj8d6lhsp0qprguqa65n60.apps.googleusercontent.com'
- onMounted(() => {
- const script = document.createElement('script')
- script.src = 'https://accounts.google.com/gsi/client'
- script.async = true
- script.defer = true
- document.head.appendChild(script)
- })
- /**
- * 初始化 Google Auth
- */
- function initializeGoogleAuth(resolve, reject) {
- return window.google.accounts.oauth2.initTokenClient({
- client_id: clientID,
- scope: 'email profile',
- callback: async (response) => {
- try {
- // 获取用户基本信息
- const userInfo = await fetchUserInfo(response.access_token)
- const res = {
- token: response.access_token,
- userInfo,
- }
- resolve(res)
- }
- catch (error) {
- reject(error)
- }
- },
- error_callback: (error) => {
- reject(error)
- },
- })
- }
- /**
- * 获取用户详细信息
- */
- async function fetchUserInfo(accessToken) {
- const res = await fetch('https://www.googleapis.com/oauth2/v3/userinfo', {
- headers: {
- Authorization: `Bearer ${accessToken}`,
- },
- })
- if (!res.ok)
- throw new Error('获取用户信息失败')
- return await res.json()
- }
- // 触发登录
- function handleGoogleLogin() {
- return new Promise((resolve, reject) => {
- if (!window.google) {
- const t = setTimeout(() => {
- clearTimeout(t)
- ElMessage.error('当前环境不支持 Google 登录,请使用其他方式登录')
- reject(new Error('Google SDK not loaded'))
- }, 1000)
- return
- }
- const client = initializeGoogleAuth(resolve, reject)
- client.requestAccessToken()
- })
- }
- async function onGoogleLogin() {
- try {
- loading.value = true
- const result = await handleGoogleLogin()
- loading.value = false
- return result
- }
- catch (error) {
- loading.value = false
- }
- }
- return { loading, onGoogleLogin }
- }
|