7

嗨,我正在查看flask-login,它很好地处理了会话登录,这对于我可以访问会话的模板和视图很有用。

不过,我一直在想知道是否有办法可以发送 user_token 来授权通话。我查看了文档,对此非常模糊。它说我应该

  • 在我的用户对象中实现 get_auth_token。
  • 装饰一个可以加载用户令牌库的@user_loader 函数。

我虽然看过以下内容(如果我错了,请纠正我)

  • 存储身份验证令牌的 Cookie 库有一种方法,我可以决定将令牌作为参数、正文或标头的一部分发送,而不必从 cookie 中获取它。
  • 我不太确定如何使用身份验证令牌对呼叫进行身份验证。
4

3 回答 3

9

我有一种更好的方法,可以更好地满足我的需求。基本上,如果您查看flask-plugin的源代码,我会非常简单直接地扩展LoginManager,您会意识到有一个调用@before_request 有一个名为reload_user的方法,这就是我最终要做的

class CustomLoginManager(LoginManager):
    def reload_user(self):
        if request.headers.has_key('Authorization'):
            ctx = _request_ctx_stack.top
            ctx.user = User.get(token=request.headers['Authorization'])
            return
        super(CustomLoginManager,self).reload_user()

如果在我的标题中我传递了一个授权密钥,那么我将尝试使用这个密钥而不是基于会话的方法来加载,当然我需要通过签署密钥来为这种方法添加更多的安全层,但总的来说这就是我需要。

谢谢大家。

顺便说一句,您可以覆盖一堆其他方法,我强烈建议您看一下插件源,这样您就可以更深入地了解它的作用 644 行代码值得一读

https://github.com/maxcountryman/flask-login/blob/master/flask_login.py

于 2013-01-26T01:36:36.870 回答
5

似乎您想要 OAuth 之类的东西,而不是使用 Flask-Login。如果您不知道(引自 Wikipedia),OAuth 是一种利用令牌来代表资源所有者访问资源的协议。考虑让用户能够为您网站的某些部分提供代客钥匙。许多网站(例如 Google、Facebook 和 Twitter)使用 OAuth 对第三方客户端进行身份验证,以便访问某些用户资源。

目前,不太灵活但不太复杂的 OAuth 1.0a 和更灵活但更复杂的 OAuth 2.0 之间存在分歧。Python 中存在许多用于 OAuth 1.0a 的库,但用于 OAuth 2.0 的库较少。但是,如果稳定性不是目前最关心的问题,则可以选择用于 OAuth 2.0 的那些。

对于客户端,如果您使用 OAuth 1.0a,则可以使用Flask-OAuth,它由 Flask 创建者 Armin 维护,因此您可以放心,它不会死。对于提供者,有一个名为Flask-OAuthProvider的扩展,支持 OAuth 1.0a。如果您不介意自己集成它并需要 2.0 支持,那么 pyoauth2为您提供了客户端和提供者,尽管它看起来不太维护。

希望这可以帮助您探索一种使用身份验证令牌的可能途径,尽管不使用 Flask-Login。在我看来,除非他们理解协议,否则不应重新实现协议,因此即使您决定不使用它,我也建议您阅读有关 OAuth 的信息。上面有很多很棒的文章,比如谷歌的这篇文章这篇文章。

于 2013-01-16T16:34:00.407 回答
1

作为一个更新,Flask-Login 现在有一个 'header_loader' 功能,可以与标准的 'user_loader' 结合使用。直接取自文档:


@login_manager.header_loader
def load_user_from_header(header_val):
    if header_val.startswith('Basic '):
        header_val = header_val.replace('Basic ', '', 1)
    try:
        header_val = base64.b64decode(header_val)
    except TypeError:
        pass
    return User.query.filter_by(api_key=header_val).first()

这是Flask-Login 文档中该部分的链接

于 2014-01-26T20:38:09.500 回答