首页 > 解决方案 > 使用 Django Allauth 在 Steam OpenID 身份验证中设置用户名

问题描述

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

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

我已经将其追溯到 和 之间的某个allauth.socialaccount.adapter.populate_user地方allauth.account.utils.user_username

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

标签: djangodjango-allauthsteam

解决方案


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

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',)

推荐阅读