【问题标题】:How to show user a form to set username when using django with django-social-auth如何在使用 django 和 django-social-auth 时向用户显示一个表单以设置用户名
【发布时间】:2011-07-16 01:43:07
【问题描述】:

我一直在使用 django-social-auth (https://github.com/omab/django-social-auth),并取得了一些成功 - 从 Twitter 和 Facebook 登录已经很容易设置。但是,当我从一些 OpenID 提供商登录时,我会遇到用户名的空变量,而 social-auth 应用程序允许这样做(尽管我设置了 SOCIAL_AUTH_DEFAULT_USERNAME)。

虽然如果 SOCIAL_AUTH_DEFAULT_USERNAME 工作正常,这可能是一个临时解决方案,但理想情况下,我宁愿它是从 openID 提供程序自动设置的。基本上,我有两种可能的解决方案:

1) 创建一个自定义方法来提取从 openID 提供程序发送的一些额外数据,以从中设置用户名。 2) 强制用户在首次登录时设置用户名。

虽然 (2) 不太优雅,但它确保每次都插入用户名,并且还避免了对可能不适合用户名格式的自动信息进行一些后处理的需要。

我的问题相当于,我该如何实施上述任何一项!不需要完整的答案,但非常感谢指向方法的指针!

另一种方法是使用 django-socialregistration,看看这是否让生活更轻松!

J

【问题讨论】:

    标签: python django django-socialauth socialauth


    【解决方案1】:

    1 可能是要走的路。您可以为遇到问题的社交提供者覆盖 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 将采用您在“用户名”中的任何内容并将其用作新帐户的用户名。 如果您想要更多控制权,您也可以尝试覆盖后端的“用户名”方法。

    覆盖后端时,不要忘记将其添加到 settings.py 中的 AUTHENTICATION_BACKENDS 中。另外,我不确定这到底是如何工作的,但我认为您需要使用自定义后端将类似的内容添加到文件中,以便让 social-auth 正确链接您的后端:

    BACKENDS = {
        'facebook': CustomFacebookAuth,
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-11
      • 1970-01-01
      • 1970-01-01
      • 2012-12-07
      • 2017-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多