【问题标题】:Adding a new backend in Python Social Auth在 Python Social Auth 中添加新的后端
【发布时间】:2017-07-16 09:44:25
【问题描述】:

python-social auth 的文档描述了如何添加身份验证后端,但没有说明将新支持的 CLIENT_IDCLIENT_SECRET 放在哪里。

以下是相关文档:http://python-social-auth.readthedocs.io/en/latest/backends/implementation.html#oauth

【问题讨论】:

    标签: python django python-social-auth


    【解决方案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))
    

    【讨论】:

      【解决方案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
      

      【讨论】:

      • 虽然这可行,但它不是最好的方法。 Python-socail-auth 支持 Django 设置,这些设置是为任何自定义后端自动生成的。设置方法见stackoverflow.com/a/65891608/2800876
      猜你喜欢
      • 1970-01-01
      • 2021-08-03
      • 1970-01-01
      • 2013-03-02
      • 2013-12-13
      • 2014-11-02
      • 2019-07-16
      • 1970-01-01
      • 2018-07-18
      相关资源
      最近更新 更多