【问题标题】:How can I ask for different permissions from facebook at different times?如何在不同时间向 facebook 请求不同的权限?
【发布时间】:2014-04-22 16:38:09
【问题描述】:

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 应用程序中实现,如果可以,如何实现?

【问题讨论】:

  • 查看psa.matiasaguirre.net/docs/…的文档,它将为您提供如何操作的示例。
  • 感谢@omab(我刚刚注意到 github 提交记录了这一点)。如果您添加该 git diff 的内容作为答案,我会很乐意接受。
  • 我已经添加了包含内容的答案并链接到文档。

标签: django facebook python-social-auth


【解决方案1】:

(以下文本摘自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()) 中返回范围值的方法,并在 GETPOST 数据中的参数指示的情况下将额外值添加到列表中(self.data)。

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

定义一个后端来处理作用域

可以通过定义第二个后端来做同样的事情,该后端从原始后端扩展但覆盖名称,这将意味着新的 URL 和新后端的新设置(因为名称用于构建设置名称),它还意味着提供程序中的新应用程序,因为并非所有提供程序都为您提供定义多个重定向 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

【讨论】:

    猜你喜欢
    • 2020-10-14
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 2015-08-23
    • 2021-06-12
    • 1970-01-01
    相关资源
    最近更新 更多