烧瓶登录机制来验证每个令牌我的调用

Posted

技术标签:

【中文标题】烧瓶登录机制来验证每个令牌我的调用【英文标题】:Flask login mechanisim to authenticate per token my calls 【发布时间】:2012-12-29 10:37:37 【问题描述】:

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

尽管如此,我一直想知道是否有办法可以发送 user_token 来授权呼叫。我查看了文档,对此非常模糊。它说我应该

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

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

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

【问题讨论】:

这里有同样的问题,让我知道你想出了什么。我们即将分叉 Flask-Login。 那太好了,我在想同样的原因,因为我最终没有使用 OAuth 作为提供者,因为我需要它太麻烦了,有一个关于它的线程librelist.com/browser//flask/2013/1/16/…跨度> 【参考方案1】:

我找到了一种更好的方法,更适合我的需求。基本上,如果你看一下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

【讨论】:

这正是我所需要的。它允许我创建一个移动 API 客户端,该客户端仅使用 X-Auth-Token 标头处理 API 调用,而我的常规 Web 客户端可以使用常规身份验证会话调用 API。不错! 不知道此代码是否在 reload_user() 函数被赋予额外参数“用户”之前给出。为了让这个今天工作,请添加: def reload_user(self, user=None): .... super(...).reload_user(user)【参考方案2】:

您似乎想要 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 的内容。上面有很多很棒的文章,比如this article from Google和this one, too。

【讨论】:

我会看看它,谢谢似乎是正确的道路【参考方案3】:

作为一个更新,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的链接

【讨论】:

以上是关于烧瓶登录机制来验证每个令牌我的调用的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 current_user 没有在烧瓶登录中进行身份验证?

React 登录和用户认证方法

如何使用本机反应创建登录以及如何验证会话

如何在 python 中生成唯一的身份验证令牌?

Azure 身份验证受众验证失败

JWT 令牌基于仪表板应用程序的每个请求的身份验证