You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 10:32:38