如何在Django应用中集成Firebase谷歌登录认证功能
Django集成Firebase谷歌登录实现用户认证方案
1. 初始化Firebase Admin到Django项目
在项目根目录创建firebase_config.py,用服务账号JSON完成Firebase Admin初始化:
import firebase_admin from firebase_admin import credentials, auth import os # 建议用环境变量存储文件路径,避免硬编码敏感信息 cred = credentials.Certificate(os.getenv('FIREBASE_SERVICE_ACCOUNT_PATH')) firebase_admin.initialize_app(cred)
2. 前端实现谷歌登录按钮
在Django登录模板(如login.html)中引入Firebase Web SDK,添加登录按钮并处理登录逻辑:
<!-- 引入Firebase SDK --> <script src="https://www.gstatic.com/firebasejs/9.23.0/firebase-app.js"></script> <script src="https://www.gstatic.com/firebasejs/9.23.0/firebase-auth.js"></script> <script> // 替换为你的Firebase Web配置信息 const firebaseConfig = { apiKey: "YOUR_API_KEY", authDomain: "YOUR_AUTH_DOMAIN", projectId: "YOUR_PROJECT_ID", storageBucket: "YOUR_STORAGE_BUCKET", messagingSenderId: "YOUR_MESSAGING_SENDER_ID", appId: "YOUR_APP_ID" }; firebase.initializeApp(firebaseConfig); const auth = firebase.auth(); // 谷歌登录触发函数 function signInWithGoogle() { const provider = new firebase.auth.GoogleAuthProvider(); auth.signInWithPopup(provider) .then((result) => { // 获取用户ID Token并发送到后端验证 result.user.getIdToken().then((idToken) => { fetch('/api/verify-token/', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRFToken': '{{ csrf_token }}' }, body: JSON.stringify({token: idToken}) }) .then(response => response.json()) .then(data => { if (data.success) { window.location.href = '/dashboard/'; // 登录成功跳转主页 } }); }); }) .catch((error) => { console.error('登录失败:', error); }); } </script> <!-- 谷歌登录按钮 --> <button onclick="signInWithGoogle()" style="padding: 8px 16px; background: #4285F4; color: white; border: none; border-radius: 4px;"> 用谷歌账号登录 </button>
3. 后端验证Token并同步用户到Firebase Auth
创建Django视图处理Token验证与用户同步逻辑:
from django.http import JsonResponse from django.views.decorators.http import require_POST from django.views.decorators.csrf import csrf_exempt import json from firebase_admin import auth from django.contrib.auth.models import User @require_POST @csrf_exempt def verify_token(request): try: data = json.loads(request.body) id_token = data.get('token') # 验证Firebase ID Token decoded_token = auth.verify_id_token(id_token) uid = decoded_token['uid'] email = decoded_token['email'] name = decoded_token.get('name') photo_url = decoded_token.get('picture') # 检查Firebase Auth中是否存在用户(登录时Firebase已自动创建,此步骤为冗余校验) try: auth.get_user(uid) except auth.UserNotFoundError: auth.create_user( uid=uid, email=email, display_name=name, photo_url=photo_url ) # 可选:同步用户信息到Django内置User模型 django_user, _ = User.objects.get_or_create( email=email, defaults={ 'username': email.split('@')[0], 'first_name': name.split(' ')[0] if name else '', 'last_name': ' '.join(name.split(' ')[1:]) if name else '' } ) # 用Session维护登录状态 request.session['user_uid'] = uid request.session['user_email'] = email return JsonResponse({ 'success': True, 'user': { 'email': email, 'name': name, 'avatar': photo_url } }) except Exception as e: return JsonResponse({'success': False, 'error': str(e)}, status=400)
在urls.py中添加对应路由:
from django.urls import path from .views import verify_token urlpatterns = [ # 其他路由... path('api/verify-token/', verify_token, name='verify-token'), ]
4. 后续登录状态校验
在需要权限的视图中,通过Session校验用户身份:
from django.shortcuts import render, redirect from firebase_admin import auth def dashboard(request): user_uid = request.session.get('user_uid') if not user_uid: return redirect('login') # 从Firebase Auth获取最新用户信息 user = auth.get_user(user_uid) return render(request, 'dashboard.html', {'user': user})
内容的提问来源于stack exchange,提问作者Dan Newt
相关产品推荐
相关产品推荐

