Django社交认证多账号关联

11

我正在使用django social-auth (http://django-social-auth.readthedocs.org/en/latest/index.html) ,并尝试创建一个用户配置文件,允许用户关联多个帐户(就像在Stackoverflow上一样)。

当前,单个用户可以使用不同的身份验证提供程序进行登录,但是针对每个登录会创建一个新用户。如何将所有用户帐户关联到单个用户(例如用户配置文件)?

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

2个回答

12

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

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

编辑:链接到文档并提供解释。


但是为什么要将其添加到管道中,而不是使用post_save回调呢?后者应该可以在任何身份验证后端创建用户的情况下工作。 - knipknap
@omab,你提供的流水线链接已经失效了。 - lmiguelvargasf
1
@lmiguelvargasf,这个问题是3年前的了,从那时起django-social-auth就已经被废弃了,python-social-auth取代了它。管道文档在https://python-social-auth.readthedocs.io/en/latest/pipeline.html。 - omab

1

当你想处理多个账户关联时,我看到了两种选择:

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

第一种方法有两个缺点:

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

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

我建议您采用第二种方法。设置一个主要身份提供者(LDAP,数据库或您专用的关闭和安全身份验证)。每次用户想要将“X身份提供者链接到您的帐户”时,请查找此提供者使用的属性,并将此关系保存在表中,以便将新的身份与您的主要身份联系起来。

保持对数据冲突的警觉。设置哪个提供商在为您的本地帐户设置数据时具有优先权,以避免使您的数据错误或过期。(阅读关于“确认级别”的内容)
这是一个旧辩论,因此首先要实施某些东西,开始阅读。有许多有趣的文档涉及这些问题

与Django中的特定问题相关。阅读这篇关于不同django social-auth应用程序的比较。还要查看django-socialprofile和这个旧线程


2
django-social-auth已经支持多个账户关联,并且它使用授权提供者提供的标识符加上提供者名称(在应用程序内唯一)。 - omab
哦,抱歉omab,你是对的。太久没有关注这个了。 - smartin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接