基于Django与Firebase Admin SDK的Token认证及用户数据操作问题
Hey there! You're already halfway there with setting up Firebase Admin SDK in Django and getting the ID Token from Android—nice work. Let's walk through each part clearly so you can get this up and running smoothly.
1. 接收并验证Firebase ID Token
First, you'll need a Django view that accepts the ID Token from your Android app (usually sent via a POST request). Here's how to validate it using the Firebase Admin SDK:
from django.http import JsonResponse import firebase_admin from firebase_admin import auth from django.views.decorators.csrf import csrf_exempt import json @csrf_exempt # 注意:生产环境建议用更安全的CSRF处理,比如DRF的认证类 def verify_firebase_token(request): if request.method != 'POST': return JsonResponse({'error': 'Method not allowed'}, status=405) try: # 从请求体中获取ID Token(Android端要把token放在POST的json里) data = json.loads(request.body) id_token = data.get('id_token') if not id_token: return JsonResponse({'error': 'ID Token missing'}, status=400) # 验证ID Token,可选参数check_revoked=True可以检查token是否被撤销 decoded_token = auth.verify_id_token(id_token, check_revoked=True) # decoded_token里包含用户的uid、邮箱、头像等信息(取决于Firebase认证配置) uid = decoded_token['uid'] email = decoded_token.get('email') name = decoded_token.get('name') # 接下来处理用户创建/获取逻辑 # ...(看下面的步骤) return JsonResponse({ 'status': 'success', 'uid': uid, 'email': email, 'message': 'Token verified successfully' }) except auth.InvalidIdTokenError: return JsonResponse({'error': 'Invalid ID Token'}, status=401) except auth.ExpiredIdTokenError: return JsonResponse({'error': 'Expired ID Token'}, status=401) except auth.RevokedIdTokenError: return JsonResponse({'error': 'Revoked ID Token'}, status=401) except Exception as e: return JsonResponse({'error': str(e)}, status=500)
2. 验证通过后创建/关联Django用户
Once the token is valid, you'll want to link this Firebase user to a Django User (or custom user model). The Firebase uid is a unique identifier, so we can use that to check if the user already exists in Django:
from django.contrib.auth.models import User # 接上面的verify_firebase_token函数,在获取decoded_token之后 user, created = User.objects.get_or_create( username=uid, # 用Firebase的uid作为Django用户名,保证唯一 defaults={ 'email': email, 'first_name': name.split(' ')[0] if name else '', 'last_name': name.split(' ')[-1] if name else '' } ) if created: # 如果是新创建的用户,可以设置一个随机密码(因为用户用Firebase登录,不需要Django密码) user.set_unusable_password() user.save()
提示:如果你的项目用了自定义用户模型,只需要把
User换成你的自定义模型即可,逻辑是一样的——用Firebase uid作为唯一标识来关联。
3. 添加与更新用户数据
Now that you have a Django user, you can add extra data using a profile model (since Django's default User model is limited). Let's create a simple Profile model first:
# 在你的app的models.py里 from django.db import models from django.contrib.auth.models import User class UserProfile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) phone_number = models.CharField(max_length=20, blank=True) firebase_uid = models.CharField(max_length=100, unique=True) bio = models.TextField(blank=True) def __str__(self): return self.user.username
Then, in your view, after getting the Django user, you can create or update the profile:
# 接上面的user, created = ...之后 profile, profile_created = UserProfile.objects.get_or_create( user=user, defaults={'firebase_uid': uid} ) # 示例:更新用户的手机号(假设请求里有phone_number字段) phone_number = data.get('phone_number') if phone_number: profile.phone_number = phone_number profile.save() # 返回用户信息 return JsonResponse({ 'status': 'success', 'user_id': user.id, 'profile': { 'phone': profile.phone_number, 'bio': profile.bio } })
一些额外注意事项
- CSRF保护:上面用了
@csrf_exempt是为了快速测试,生产环境建议用Django REST Framework的APIView或者添加CSRF token到请求头(Android端可以获取CSRF token后再发请求)。 - 权限控制:后续的API可以用这个验证后的用户来做权限控制,比如用
request.user来获取当前登录的用户(需要把验证后的用户绑定到request上,比如用自定义认证类)。 - Firebase用户信息同步:如果用户在Firebase更新了邮箱、名字等信息,你可以通过Firebase的云函数或者定期同步来更新Django里的用户数据。
内容的提问来源于stack exchange,提问作者rishi95

