django-sso使用疑问:获取额外字段、添加MFA及集成社交认证
Django SSO 相关问题解决方案
1. 客户端无法获取额外字段及email字段无效问题
核心原因
客户端未正确映射服务端发送的字段到本地用户模型,或缺少字段同步的信号处理器。
解决步骤
- 检查客户端用户模型字段:
用默认User模型的话,first_name、last_name已存在,需手动添加phone_number字段(可通过继承AbstractUser扩展自定义用户模型);如果是自定义用户模型,确保包含所有需要同步的字段。 - 配置客户端SSO字段映射:
在客户端settings.py中添加:SSO_ADDITIONAL_FIELDS = ['first_name', 'last_name', 'phone_number'] SSO_USERNAME_FIELD = 'email' # 让客户端将服务端的username(邮箱)赋值给本地用户的email字段 - 添加信号处理器同步字段:
在客户端项目中创建signals.py,添加以下代码:
然后在客户端from django.dispatch import receiver from django_sso_client.signals import sso_user_updated, sso_user_created @receiver([sso_user_created, sso_user_updated]) def sync_sso_user_fields(sender, user, sso_data, **kwargs): # 同步基础字段 user.email = sso_data.get('username', user.email) # 服务端把邮箱放在username字段,映射到本地email user.first_name = sso_data.get('first_name', user.first_name) user.last_name = sso_data.get('last_name', user.last_name) # 同步自定义字段 if hasattr(user, 'phone_number'): user.phone_number = sso_data.get('phone_number', user.phone_number) user.save(update_fields=['email', 'first_name', 'last_name', 'phone_number'])apps.py的ready()方法中导入信号:from django.apps import AppConfig class YourAppConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'your_app' def ready(self): import your_app.signals
2. 为登录页添加多因素认证(MFA)
针对django-mfa2的集成步骤
- 安装依赖:
pip install django-mfa2 - 在服务端
settings.py中添加配置:INSTALLED_APPS = [ # 其他应用 'mfa', ] # 可选:配置强制MFA验证 MFA_REQUIRED = True - 服务端
urls.py添加MFA路由:from django.urls import path, include urlpatterns = [ # 其他路由 path('mfa/', include('mfa.urls')), ] - 自定义SSO登录流程:
重写服务端的登录视图,在用户密码验证通过后,检查是否启用MFA,未启用则引导用户设置,已启用则跳转MFA验证页面,验证通过后再生成SSO令牌:
在MFA验证通过后的视图中,继续完成SSO的登录逻辑(生成令牌、跳转客户端)。from django.contrib.auth.views import LoginView from django.shortcuts import redirect from mfa.utils import has_mfa class SSOLoginView(LoginView): def form_valid(self, form): user = form.get_user() if has_mfa(user): # 存储用户ID到session,跳转MFA验证页 self.request.session['mfa_user_id'] = user.id return redirect('mfa:verify') return super().form_valid(form)
针对Kagi的集成步骤
- 安装Kagi Django包:
pip install kagi - 服务端
settings.py配置Kagi密钥(从Kagi控制台获取):INSTALLED_APPS = [ # 其他应用 'kagi', ] KAGI_API_KEY = 'your_kagi_api_key' KAGI_API_SECRET = 'your_kagi_api_secret' - 重写登录视图,在密码验证后调用Kagi的MFA验证接口,验证通过后再完成SSO登录:
from kagi.api import verify_mfa_code from django.contrib.auth.views import LoginView from django.shortcuts import redirect, render class SSOLoginView(LoginView): def form_valid(self, form): user = form.get_user() # 假设用户已绑定Kagi MFA,需提前将Kagi MFA ID存储在用户模型中 mfa_id = user.kagi_mfa_id if mfa_id: if 'mfa_code' not in self.request.POST: # 显示MFA输入表单 return render(self.request, 'mfa_verify.html') # 验证MFA代码 if verify_mfa_code(mfa_id, self.request.POST['mfa_code']): return super().form_valid(form) else: form.add_error(None, '无效的MFA代码') return self.form_invalid(form) return super().form_valid(form)
3. 集成社交认证与Django SSO
基于django-allauth的集成方案
- 安装依赖:
pip install django-allauth - 服务端
settings.py配置:INSTALLED_APPS = [ # 其他应用 'django.contrib.sites', 'allauth', 'allauth.account', 'allauth.socialaccount', # 添加需要的社交提供商,比如Google 'allauth.socialaccount.providers.google', ] SITE_ID = 1 AUTHENTICATION_BACKENDS = [ 'django.contrib.auth.backends.ModelBackend', 'allauth.account.auth_backends.AuthenticationBackend', ] # 配置社交登录后自动创建SSO会话 ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION = True - 服务端
urls.py添加社交认证路由:urlpatterns = [ # 其他路由 path('accounts/', include('allauth.urls')), ] - 同步社交用户信息到SSO字段:
在服务端的signals.py中添加信号处理器,当社交用户创建或更新时,同步信息到用户模型的SSO字段:from django.dispatch import receiver from allauth.socialaccount.signals import social_account_added, social_account_updated from django.contrib.auth import get_user_model User = get_user_model() @receiver([social_account_added, social_account_updated]) def sync_social_user_to_sso(sender, socialaccount, **kwargs): user = socialaccount.user extra_data = socialaccount.extra_data # 同步姓名、邮箱等字段 user.first_name = extra_data.get('given_name', user.first_name) user.last_name = extra_data.get('family_name', user.last_name) user.email = extra_data.get('email', user.email) user.save() - 调整SSO登录流程:
确保用户通过社交登录服务端后,自动生成SSO令牌并跳转客户端。可以在社交登录的回调视图中,调用django-sso的令牌生成逻辑,或者直接让服务端的SSO认证系统识别已通过社交登录的用户,允许其生成SSO令牌。
内容的提问来源于stack exchange,提问作者Imafidon Isaac
相关产品推荐
相关产品推荐

