Flask登录机制,用于对每个令牌进行身份验证

时间:2013-01-15 10:38:15

标签: authentication flask auth-token flask-login

您好我正在查看flask-login处理会话登录很好,这项工作很适合模板和查看我可以访问会话的地方。

尽管如此,我一直试图知道是否有办法将user_token发送给授权的电话。我查看了文件,对此非常模糊。它说我应该

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

我见过以下情况(如果我错了请纠正我)

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

3 个答案:

答案 0 :(得分:9)

我有一个更好的方法,更符合我的需求。基本上我扩展了LoginManager非常简单和直接,如果你看看flask-plugin的来源,你会发现有一个调用@before_request有一个叫做reload_user的方法,这就是我最终做的事情< / p>

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()

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

谢谢大家。

BTW你可以覆盖一堆别人的方法,我非常推荐看一下插件源代码,这样你就可以更深入地了解它的代码值得阅读的644行代码

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

答案 1 :(得分:5)

看起来你想要像OAuth这样的东西,而不是使用Flask-Login。如果您不知道(引自维基百科),OAuth是一种利用令牌以便代表资源所有者访问资源的协议。考虑让用户能够向您网站的某些部分发放代客密钥。许多网站(如Google,Facebook和Twitter)都使用OAuth来验证第三方客户端,以便访问某些用户资源。

目前,不太灵活且不太复杂的OAuth 1.0a与更灵活但更复杂的OAuth 2.0之间存在分歧。 Python中的OAuth 1.0a存在许多库,但OAuth 2.0中存在的库较少。但是,如果稳定性现在不是最受关注的问题,那么OAuth 2.0就可以选择。

对于客户端,Flask-OAuth可用,如果您使用的是OAuth 1.0a,它由Flask创建者Armin维护,因此您可以放心,它不会死亡。对于提供商,有一个名为Flask-OAuthProvider的扩展名,支持OAuth 1.0a。如果您不介意自己集成并希望获得2.0支持,pyoauth2会为您提供客户端和提供程序,但它看起来维护较少。

希望这可以帮助您探索使用auth令牌的一种可能途径,尽管不使用Flask-Login。在我看来,除非他们理解协议,否则不应该重新实现协议,因此即使您决定不使用它,我也建议您阅读OAuth。其中包含许多优秀文章,例如this article from Googlethis one, too

答案 2 :(得分: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()

以下是section in the Flask-Login docs

的链接