【问题标题】:Setting username in steam OpenID authentication with Django Allauth使用 Django Allauth 在 Steam OpenID 身份验证中设置用户名
【发布时间】:2020-02-26 04:37:28
【问题描述】:

我正在尝试配置一个新的 django 应用程序以使用 Steam 的 OpenID 身份验证。

我遇到的问题是,当新用户登录时(没有允许他们自定义用户名/指定电子邮件地址的表单),某些东西(allauth 或 django.contrib.auth)将其用户对象的用户名默认为user。该字段是唯一的......所以第二个用户无法登录。我无法弄清楚新用户对象的创建内容/位置,因此我们可以自定义该字段。理想情况下,我们希望它从 extra_data['personaname']) 中提取。

我已将其追溯到 allauth.socialaccount.adapter.populate_userallauth.account.utils.user_username 之间的某个位置。

填充用户只被调用一次,打印locals() 会显示<User: Steam Username>。但是user_username被调用了五次,第一次是Steam Username,最后一次是user

【问题讨论】:

    标签: django django-allauth steam


    【解决方案1】:

    最终创建了我自己的用户模型来解决这个问题。

    from django.contrib.auth.models import PermissionsMixin
    from django.db import models
    from django.utils import timezone
    from django.utils.translation import gettext_lazy as _
    
    class Player(PermissionsMixin):
        date_joined = models.DateTimeField(_('date joined'), default=timezone.now, editable=False)
        last_login = models.DateTimeField(_('last login'), blank=True, null=True, editable=False)
        username = models.CharField(_('username'), max_length=128, unique=True)
    
        REQUIRED_FIELDS=()
        USERNAME_FIELD='username'
    
        is_active = True
    
        @property
        def is_anonymous(self):
             return False
    
        @property
        def is_authenticated(self):
             return True
    
        @property
        def is_staff(self):
             return self.is_superuser
    
        @property
        def steam_id(self):
             return self.steam_account.uid
    
        @property
        def steam_account(self):
             return self.socialaccount_set.get(provider='steam')
    
        def set_unusable_password(self):
             """
             This only exists for allauth.
             """
             pass
    
        def __str__(self):
            return self.username
    
    from django.contrib import admin
    from django.utils.translation import gettext_lazy as _
    
    from .models import Player
    
    @admin.register(Player)
    class PlayerAdmin(admin.ModelAdmin):
        readonly_fields=('last_login','date_joined')
        fieldsets = (
            (_('Important dates'), {'fields': ('last_login', 'date_joined')}),
            (_('Permissions'), {'fields': ('is_superuser', 'groups', 'user_permissions')}),
        )
        list_display = ('username', 'steam_id', 'is_superuser', 'date_joined', 'last_login', 'steam_id')
        list_filter = ('is_superuser', 'groups')
        ordering = ('username','last_login', 'date_joined')
        filter_horizontal = ('groups', 'user_permissions',)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-16
      • 2020-01-05
      • 2019-05-03
      • 2019-05-03
      • 2016-06-19
      • 2013-10-28
      • 1970-01-01
      • 2021-01-19
      相关资源
      最近更新 更多