使用flask-security扩展的基于令牌的身份验证

use*_*431 13 restful-authentication flask python-3.x flask-security

我目前正在寻找一种使用基于令牌的身份验证来保护REST API的方法.我正在使用Flask在Python中开发API,并发现了flask-security扩展,它似乎有很多有趣的功能.

令牌中提到的功能之一是令牌认证.

根据文件:

通过执行HTTP POST检索用户身份验证令牌来启用基于令牌的身份验证,其中身份验证详细信息为针对身份验证端点的JSON数据.成功调用此端点将返回用户的ID及其身份验证令牌.此令牌可用于对受保护资源的后续请求.

但是,我仍然对如何使用flask-security实现此功能感到困惑.一些在线研究让我使用了诸如@auth_token_required之类的东西,但我把所有东西放在一起都有些麻烦.烧瓶安全文档本身并不是很有帮助.

例如,用户如何获得身份验证令牌?什么是身份验证端点?

如果你能引导我朝着正确的方向前进,那就太棒了.代码示例也很棒:-)

Seb*_*ian 13

端点是/ login,您将凭据发布为json请求正文:

{'email':'john@smit.com', 'password':'1234'}
Run Code Online (Sandbox Code Playgroud)

但是要实现此功能,您需要在烧瓶应用程序中禁用csrf令牌(感谢Mandar Vaze):

app.config['WTF_CSRF_ENABLED'] = False
Run Code Online (Sandbox Code Playgroud)

然后,您使用HTTP标头中的令牌执行每个请求:

Authentication-Token:WyI1NTE1MjhmNDMxY2Q3NTEwOTQxY2ZhYTgiLCI2Yjc4NTA4MzBlYzM0Y2NhZTdjZjIxNzlmZjhiNTA5ZSJd.B_bF8g.t1oUMxHr_fQfRUAF4aLpn2zjja0
Run Code Online (Sandbox Code Playgroud)

或者作为查询字符串:

http://localhost:5000/protected?auth_token=WyI1NTE1MjhmNDMxY2Q3NTEwOTQxY2ZhYTgiLCI2Yjc4NTA4MzBlYzM0Y2NhZTdjZjIxNzlmZjhiNTA5ZSJd.B_bF8g.t1oUMxHr_fQfRUAF4aLpn2zjja0
Run Code Online (Sandbox Code Playgroud)

python 3中的客户端示例:

import requests
import json

#do the login
r = requests.post('http://localhost:5000/login', 
                    data=json.dumps({'email':'john@smit.com', 'password':'1234'}), 
                    headers={'content-type': 'application/json'})
response = r.json()
print(response) #check response
token = response['response']['user']['authentication_token']    #set token value

#Now you can do authorised calls
r = requests.get('http://localhost:5000/protected', 
                headers={'Authentication-Token': token})
print(r.text)
Run Code Online (Sandbox Code Playgroud)

用于获取令牌的Angular示例代码段:

$http.post('/login', {"email": $scope.formdata.login,"password":$scope.formdata.password}).
            success(function(results) {
            $window.sessionStorage.token = results.response.user.authentication_token;
            });
Run Code Online (Sandbox Code Playgroud)

用于访问受保护页面的Angular示例代码段:

 if ($window.sessionStorage.getItem('token')) {
                config.headers['Authentication-Token'] = $window.sessionStorage.getItem('token');
            }
Run Code Online (Sandbox Code Playgroud)


Dav*_*Lin 10

我发现Flask-Security的基于令牌的不适合我的项目.我推荐使用JWT令牌.

Flask-Security基于令牌的身份验证存在的问题.

  1. 需要全局禁用CSRF,当您还有一个需要CSRF令牌的传统Web应用程序时,这并不好
  2. 没有简单的方法来续订令牌(不再提交密码)
  3. 无法控制令牌的有效负载,没有API可以将数据放入/从令牌中获取数据
  4. 根据设计,该令牌仅适用于一个Flask应用程序.因此,如果您的前端应用程序需要与多个restful apis交谈,这将无法正常工作

查看JWT(pyjwtflask-jwt)令牌,它解决了上述所有问题等等.

  • 您在这里比较苹果和香蕉。Flask-security/login 中有大量在 Flask-jwt 中找不到的功能(密码重置、联合、访问列表等)。如果您需要有效负载,只需通过覆盖两个相应的方法来在后台使用 jwt在用户模型中。 (3认同)

Man*_*aze 2

身份验证端点是/login

这里具体看一下flask-security的代码views.py:_render_json()

login() 调用 _render_json ,后者又调用 get_auth_token() - 并返回身份验证令牌。

(对我来说)问题是让它发挥作用。对我来说 request.json 似乎是空的(因此这不起作用

{"email": "test@example.com", "password": "test123"}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助您向前迈进一点。