对于REST API,我可以使用flask-login提供的身份验证机制吗?或者我必须明确使用基于令牌的身份验证,如JW



规范: 我正在使用PyQt5用Python编写一个桌面应用程序。我的应用程序通过提供RESTful路由的Flask API与远程数据库通信。Flask API和数据库位于同一台服务器上。在客户端,我使用Python中的Requests模块。我必须在我的应用程序中实现用户身份验证和授权系统。目前,我正在使用flask登录。

@app.route("/login", methods=['POST'])
def login():
user = User.query.filter_by(email = request.form["email"]).first()
if user and check_password():
flask_login.login_user(user, remember=request.form['remember'])
return Response(status=201)
else:
return Response(status=401)

在上面的代码中,我正在检查用户是否存在以及哈希密码是否匹配。如果是这样的话,flask_login将自动登录用户,并发回一个cookie作为响应,我可以使用它进行会话管理和其他操作。

我的问题:我到处都读到,基于令牌的身份验证系统用于保护API。但是,我目前的做法有什么问题吗?这不是实现身份验证的常规方法吗?此外,它在任何意义上都不如基于令牌的系统安全吗?

问题的答案不是直截了当的,但简而言之,这可能是确保API安全的一种糟糕方法。然而,如果这是你熟悉的,你可能会这样做,因为他们并不是"技术"原因,所以这实际上不起作用。

API通常希望每次请求都向API发送访问凭证/令牌。这类似于web服务器(Flask)直接返回html/js代码时对请求进行身份验证的方式。

然而,不同之处在于客户端用于提交身份验证证明的机制。在后端提供前端代码的典型应用程序中,cookie用于存储会话信息,这些cookie由客户端(浏览器)在每次请求时自动发送到后端。

在您的情况下,Flask Login会查看这些cookie,验证其真实性,并根据服务器上会话中存储的信息确定是哪个用户提出了请求。

您提到您的客户端是一个使用Python请求库的桌面应用程序,因此如果您想继续使用现有的auth方法,则需要对桌面客户端进行编程,以便使用请求发送请求。会话对象。这基本上会包装您的请求并为您存储cookie。要做到这一点,您首先请求使用该请求登录。会话对象,然后所有后续请求都会自动发送cookie,您的Flask应用程序会看到您的桌面应用程序已登录。查看文档了解更多信息。

然而,使用API,Flask web服务器不会直接向客户端提供前端代码。事实上,API不应该关心客户端是否有前端。据API所知,客户端可能是另一个脚本或在终端中运行curl命令的用户等。重要的是,客户端可能有也可能没有"cookie"的概念。因此,API需要一种方法来验证传入的请求是否得到授权。

就像cookie需要与每个请求一起发送一样,API需要与每个要求一起发送的内容,该内容表示";嘿,服务员,我是一个请求,我被授权了">

显而易见的解决方案是在每次请求时都发送用户名和密码。这个解决方案是非常基本的,被恰当地称为basic Auth。显然,这里存在安全问题,但如果http流量是加密的(https),在客户端是在安全框上运行的进程,从安全文件中读取密码的情况下,基本身份验证可能是可以的。

Python请求模块在:链接到文档中对此提供了支持这很简单,只需提出这样的请求:

requests.get('https://api.github.com/user', auth=('user', 'pass'))

然后在烧瓶后端上

@app.route(...)
def some_route():
username = request.authorization.username
password = request.authorization.password
# check to make sure username/password is okay
# could abstract this code as a decorator and apply it to multiple routes
# that you want protected by basic auth

还有一个Flask BasicAuth模块,它似乎让Flask非常容易接受基本身份验证,尽管我从未使用过它

然而,在客户端不能被认为是超级安全的情况下,比如前端web应用程序,作为开发人员,你可能不想将用户名和密码直接存储在浏览器中,很可能有人只是查看本地存储等并查看用户凭据。

基于令牌的身份验证是另一个更安全的选项,基本上客户端将用户名/密码凭据发送到后端一次,然后将其交换为令牌。然后,该令牌与客户端发出的每个请求一起发送。在后端,web服务器可以验证令牌的真实性,也可以从中提取身份。令牌可以通过HTTP头发送,也可以通过url查询字符串发送。IE www.myapi.com/some-end-point?令牌=1234678

然后,如果令牌被泄露,用户可以使用相同的用户名/密码来获得另一个令牌,并且旧令牌可能会过期。

如果您想使用基于令牌的身份验证方法,请查看JSON Web令牌(JWT),特别是以下Flask插件:JWT扩展烧瓶Flask Praetorian

相关内容

最新更新