如何在使用django-social-auth的django中显示设置用户名的表单

0 投票
1 回答
815 浏览
提问于 2025-04-16 21:39

我一直在使用django-social-auth(https://github.com/omab/django-social-auth),效果还不错——从Twitter和Facebook登录都很顺利。不过,当我尝试从一些OpenID提供商登录时,用户名的变量却是空的,而社交认证应用程序对此没有限制(尽管我已经设置了SOCIAL_AUTH_DEFAULT_USERNAME)。

虽然如果SOCIAL_AUTH_DEFAULT_USERNAME能正常工作,那可能是一个临时解决办法,但我更希望它能自动从OpenID提供商那里获取用户名。总的来说,我有两个可能的解决方案:

1) 创建一个自定义方法,从OpenID提供商发送的额外数据中提取信息,以此来设置用户名。
2) 强制用户在第一次登录时设置一个用户名。

虽然第二种方法不太优雅,但它确保每次都有用户名被输入,也避免了对自动获取的信息进行后处理,因为这些信息可能不适合用作用户名。

我的问题是,如何实现以上任一方案!不需要完整的答案,但如果能给我一些方法上的指引,我会非常感激!

另外一个选择是尝试使用django-socialregistration,看看是否能让事情变得简单一些!

J

1 个回答

2

第一种方法可能是最好的选择。你可以重写Backend类中的get_user_details方法,针对那些你遇到问题的社交平台,从那里获取用户名。

比如说,对于Facebook,它的代码大概是这样的:

from social_auth.backends.facebook import FacebookBackend
class CustomFacebookBackend(FacebookBackend):
    name = 'facebook'

    def get_user_details(self, response):
        """Return user details from Facebook account"""
        return {'username': response['name'],
                'email': response.get('email', ''),
                'first_name': response.get('first_name', ''),
                'last_name': response.get('last_name', '')}

这里的“response”变量是从OAuth提供者那里请求用户信息后返回的数据,你可以从中提取你需要的任何信息,或者在这里插入你自己的值。social-auth会把你放在“username”里的内容当作新账户的用户名。如果你想要更多的控制权,也可以尝试重写后端的“username”方法。

在重写后端的时候,别忘了在settings.py文件中的AUTHENTICATION_BACKENDS里添加它。此外,我不太确定具体是怎么回事,但我觉得你需要在自定义后端的文件里添加类似这样的内容,以便让social-auth正确地链接你的后端:

BACKENDS = {
    'facebook': CustomFacebookAuth,
}

撰写回答