【问题标题】:Rotating consumer_secret with Flask-Appbuilder使用 Flask-Appbuilder 轮换 consumer_secret
【发布时间】:2018-05-21 20:37:46
【问题描述】:

有一个带有自定义 SecurityManager 的 Flask-Appbuilder 应用程序,用于查找从浏览器获取的用户令牌。我们在应用程序启动时获取客户端凭据。直到凭证轮换为止,它都可以正常工作。
有没有可以实现从外部资源请求customer_idcustomer_secret 的扩展点?

SecurityManager 实现:

class MySecurityManager(SecurityManager):

    TOKENINFO_URL = "..."
    USERINFO_URL = ".../{}"

    def __init__(self, appbuilder):
        super(MySecurityManager, self).__init__(appbuilder)

    def get_oauth_user_info(self, provider, resp=None):
        """
            We authenticate users against Our OAuth provider
        """
        if provider == 'MyProvider':
            tokeninfo = self.appbuilder.sm.oauth_remotes[provider].get(self.TOKENINFO_URL)
            uid = tokeninfo.data.get('uid')
            user = self.appbuilder.sm.oauth_remotes[provider].get(self.USERINFO_URL.format(uid))
            log.debug("Token info: {0}".format(tokeninfo.data))
            log.debug("User info: {0}".format(user.data))
            return {'username': tokeninfo.data.get('uid', ''),
                    'email': user.data.get('email', ''),
                    'first_name': user.data.get('name', '').split(" ")[0],
                    'last_name': user.data.get('name', '').split(" ")[-1]}

        else:
            return super(MySecurityManager, self).get_oauth_user_info(provider, resp=None)

config.py

OAUTH_PROVIDERS = [
  {
    'name': 'MyProvider',
    'icon': ...,
    'token_key': ...,
    'remote_app': {
      'base_url': ...,
      'consumer_key': SUPERSET_OAUTH_CONSUMER_KEY,
      'consumer_secret': SUPERSET_OAUTH_CONSUMER_SECRET,
      'request_token_params': {
        'scope': ...,
      },
      'request_token_url': ...,
      'access_token_url': ...,
      'authorize_url': ...,
    }
  }
]

【问题讨论】:

    标签: python oauth-2.0 flask-appbuilder apache-superset


    【解决方案1】:

    我通过覆盖获取 oauth_providers 表单 https://github.com/dpgaspar/Flask-AppBuilder/blob/master/flask_appbuilder/security/manager.py#L306 解决了它。 举个例子:

     @property
        def oauth_providers(self):
            providers = self.appbuilder.get_app.config['OAUTH_PROVIDERS']
            for provider in providers:
                if provider['name'] == 'XXXX':
                    # rotate logic here
                    provider['remote_app']['consumer_key'] = xxxxx
                    provider['remote_app']['consumer_secret'] = xxxx
            return providers
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-09
      • 2019-05-17
      • 2018-07-13
      • 2019-07-26
      • 2019-01-21
      • 2018-12-19
      • 2020-09-29
      • 2020-03-04
      相关资源
      最近更新 更多