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

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令牌:
    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)
    
    在MFA验证通过后的视图中,继续完成SSO的登录逻辑(生成令牌、跳转客户端)。

针对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 07:43:15