在Python Social Auth中添加新的后端

时间:2017-02-25 14:59:25

标签: python django python-social-auth

否指定在何处指定我们自定义添加的支持的CLIENT ID和CLIENT SECRET。 http://python-social-auth.readthedocs.io/en/latest/backends/implementation.html#oauth

2 个答案:

答案 0 :(得分:2)

我已经用这种方式实现了它:

from django.conf import settings

class CustomOAuth2(BaseOAuth2):
    name = 'custom'

    def get_key_and_secret(self):
        return settings.CUSTOM_OAUTH_CLIENT_ID, settings.CUSTOM_OAUTH_CLIENT_SECRET

答案 1 :(得分:1)

您将它们指定为 Django 设置。设置的名称是根据自定义后端的 name 参数动态生成的,格式为 SOCAIL_AUTH_[BACKEND_NAME]_KEYSOCAIL_AUTH_[BACKEND_NAME]_SECRET

例如,如果您的自定义后端如下所示:

class TimelyOAuth2(BaseOAuth2):
    name = "custom-backend"
    # ...

您可以将以下内容放入 settings.py:

SOCIAL_AUTH_CUSTOM_BACKEND_KEY = "..."
SOCIAL_AUTH_CUSTOM_BACKEND_SECRET = "..."

(当然,不要把你的密钥和秘密直接放在设置中;使用类似 Django-environ 的东西)


来源

这在我能找到的 python-social-auth 中的任何地方都没有记录。我通过阅读 social_core/backends/base.py、social_core/strategy.py 和 social_core/utils.py 中的相关代码发现了这一点。关键方法是 get_key_and_secret,它试图从设置变量中获取这些内容。相关代码摘录如下:

# social_core/backends/base.py
class BaseAuth(object):
    def get_key_and_secret(self):
         return self.setting('KEY'), self.setting('SECRET')


# social_core/strategy.py
class BaseStrategy(object):
    def setting(self, name, default=None, backend=None):
        names = [setting_name(name), name]
        if backend:
            names.insert(0, setting_name(backend.name, name))
        for name in names:
            try:
                return self.get_setting(name)
            except (AttributeError, KeyError):
                pass
        return default


# social_core/utils.py
SETTING_PREFIX = 'SOCIAL_AUTH'

def to_setting_name(*names):
    return '_'.join([name.upper().replace('-', '_') for name in names if name])

def setting_name(*names):
    return to_setting_name(*((SETTING_PREFIX,) + names))