Django社会认证多账户关联



我正在使用django social-auth (http://django-social-auth.readthedocs.org/en/latest/index.html),并试图创建一个用户配置文件,用户可以关联多个帐户(就像这里的Stackoverflow)。

目前,我处于单个用户可以使用不同的身份验证提供者登录的情况,但每次登录都会创建一个新用户。如何将所有用户帐户关联为单个帐户(如用户配置文件)?

另外,当使用django social-auth时,创建用户配置文件页面的最佳实践是什么?

DSA已经支持多帐户关联,诀窍是用户必须登录,否则DSA不知道它应该与一个已经存在的帐户关联。

关于您的配置文件,向DSA添加功能的推荐方法是扩展管道,您可以创建如下条目:

def create_profile(user, is_new=False, *args, **kwargs):
    if is_new:
        # create a profile instance for the given user
        create_user_profile(user)

然后像这样在设置中注册:

SOCIAL_AUTH_PIPELINE = (
    'social_auth.backends.pipeline.social.social_auth_user',
    'social_auth.backends.pipeline.user.get_username',
    'social_auth.backends.pipeline.user.create_user',
    'social_auth.backends.pipeline.social.associate_user',
    'social_auth.backends.pipeline.social.load_extra_data',
    'social_auth.backends.pipeline.user.update_user_details',
    'myapp.pipeline.create_profile'
)

条目是获取该函数的导入路径。

编辑:链接到文档和设置说明

当您想处理多帐户关联时,我看到2种选择:

    1. 查找所有身份提供者具有的唯一属性。
  • 保持一个基本身份验证,并将所有其他身份提供者链接到它的。

第一种方法有两个缺点

  • 可能不存在所有标识提供程序中存在的任何属性。过去人们常用的一种实现是使用电子邮件作为标识用户的属性,但例如Twitter不再共享电子邮件。

  • 可以发现不一致的问题。例如,人们可以在不同的提供商中为用户名或电子邮件设置不同的值。

我建议您实现第二种方法。设置一个主身份提供程序(ldap、数据库或身份验证对您关闭且安全)。每次用户想要链接"X身份提供者到您的帐户"时,查找该提供者使用的属性,并在表中保存您的主身份和新身份之间的关系。

还要注意数据冲突。在为您的本地帐户设置数据时,设置哪个提供商将具有首选项,以便不会使您的数据出错或过期。(阅读有关"保证级别"的内容)

这是一个古老的争论,所以首先要实现一些东西,开始阅读。关于这个问题有很多有趣的文档

与django中的特定问题相关。阅读一下不同的django社交认证应用程序之间的比较。同时检查django-socialprofile和这个旧线程

最新更新