烧瓶登录机制来验证每个令牌我的调用
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的链接
【讨论】:
以上是关于烧瓶登录机制来验证每个令牌我的调用的主要内容,如果未能解决你的问题,请参考以下文章