django - 如何在不同时间向 facebook 请求不同的权限?

标签 django facebook python-social-auth

Facebook 建议,在使用 Facebook 登录时,您应该首先要求用户提供尽可能少的权限,尤其是在用户需要通过您的网站发布内容之前,避免请求发布权限 - https://developers.facebook.com/docs/facebook-login/permissions/#optimizing .

我们一直在尝试使用 python-social-auth 的 django 应用程序来实现这一点,但似乎无法在网站的不同点请求不同的权限 - 范围是通过 SOCIAL_AUTH_FACEBOOK_SCOPE< 设置的 设置,以后不可能请求不同的范围(例如,从 SOCIAL_AUTH_FACEBOOK_SCOPE 中排除 publish_actions,然后要求用户在尝试时提供该权限从您的网站发布到 Facebook)。

有谁知道这在 python-social-auth 应用程序中是否可行,如果可行,如何实现?

最佳答案

(以下文字摘自 http://psa.matiasaguirre.net/docs/use_cases.html#multiple-scopes-per-provider 的文档)

目前 python-social-auth 没有提供为单个后端定义多个范围的方法,这通常是需要的,因为建议向用户询问可能的最小范围并在真正需要时增加访问权限。可以添加一个新的后端来扩展原始后端来完成该行为,有两种方法可以做到这一点。

覆盖get_scope()方法

from social.backends.facebook import FacebookOAuth2


class CustomFacebookOAuth2(FacebookOauth2):
    def get_scope(self):
        scope = super(CustomFacebookOAuth2, self).get_scope()
        if self.data.get('extrascope'):
            scope += [('foo', 'bar')]
        return scope

此方法非常简单,它覆盖了在后端返回范围值的方法 (get_scope()) 并在 中的参数指示的情况下将额外值添加到列表中code>GETPOST 数据(self.data)。

将这个新后端放在项目中的某个位置,并将 AUTHENTICATION_BACKENDS 中的原始 FacebookOAuth2 替换为这个新版本。

定义后端来处理作用域

可以通过定义第二个后端来实现相同的目的,该后端从原始后端扩展但覆盖名称,这将意味着新的 URL 以及新后端的新设置(因为该名称用于build设置名称),它还意味着提供程序中的新应用程序,因为并非所有提供程序都为您提供定义多个重定向 URL 的选项。要做到这一点,只需添加一个后端,如:

from social.backends.facebook import FacebookOAuth2


class CustomFacebookOAuth2(FacebookOauth2):
    name = 'facebook-custom'

将这个新后端放在项目中的某个位置,将原始 FacebookOAuth2 保留在 AUTHENTICATION_BACKENDS 中。现在,一组新的 URL 将起作用:

/login/facebook-custom
/complete/facebook-custom
/disconnect/facebook-custom

还有一组新的设置:

SOCIAL_AUTH_FACEBOOK_CUSTOM_KEY = '...'
SOCIAL_AUTH_FACEBOOK_CUSTOM_SECRET = '...'
SOCIAL_AUTH_FACEBOOK_CUSTOM_SCOPE = [...]

当需要额外的权限时,只需将用户重定向到 /login/facebook-custom 然后使用 user.social_auth.get(provider ='facebook-custom') 并使用其中的 access_token

关于django - 如何在不同时间向 facebook 请求不同的权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22454957/

相关文章:

python - 在尝试创建 django-admin startproject :No module name django-admin 时

python - Elasticsearch-dsl 嵌套查询

django - 强制谷歌通过 python 社交身份验证刷新 token

python - 用 celery 在 django 中实现 zeromq publisher (Broker redis)

python - 未提供异常消息(Django REST POST)

facebook - 在 Facebook API 中,如何从通知对象中检索源对象?

ios - 用于在 Swift 中获取 facebook 好友列表的图形路径和参数

c# - Facebook 注销 C# SDK

python - 如何在 python 社交身份验证中通过 facebook uid 查找用户?

oauth - Pinterest OAuth 重定向 URI 不工作