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

时间:2014-12-08 11:22:34

标签: python-3.x flask restful-authentication flask-security

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

文档中提到的功能之一是令牌验证。

根据文件:

  

通过检索用户身份验证启用基于令牌的身份验证   通过执行带有身份验证详细信息的HTTP POST的令牌   针对身份验证端点的JSON数据。成功打电话给   此端点将返回用户的ID及其身份验证   令牌。此令牌可用于后续的受保护请求   资源。

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

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

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

3 个答案:

答案 0 :(得分:11)

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

{'email':'john@smit.com', 'password':'1234'}

然而,要使其工作,您需要在烧瓶应用程序中禁用csrf标记(感谢Mandar Vaze):

app.config['WTF_CSRF_ENABLED'] = False

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

Authentication-Token:WyI1NTE1MjhmNDMxY2Q3NTEwOTQxY2ZhYTgiLCI2Yjc4NTA4MzBlYzM0Y2NhZTdjZjIxNzlmZjhiNTA5ZSJd.B_bF8g.t1oUMxHr_fQfRUAF4aLpn2zjja0

或者作为查询字符串:

http://localhost:5000/protected?auth_token=WyI1NTE1MjhmNDMxY2Q3NTEwOTQxY2ZhYTgiLCI2Yjc4NTA4MzBlYzM0Y2NhZTdjZjIxNzlmZjhiNTA5ZSJd.B_bF8g.t1oUMxHr_fQfRUAF4aLpn2zjja0

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)

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

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

访问受保护网页的Angular示例代码段:

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

答案 1 :(得分:8)

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

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

  1. 需要全局禁用CSRF,当您还有一个需要CSRF令牌的传统Web应用程序时,这不是很好
  2. 没有简单的方法来续订令牌(不再提交密码)
  3. 无法控制令牌的有效负载,没有API将数据放入/从令牌中获取数据
  4. 该标记在设计上仅适用于一个Flask应用。因此,如果你的前端应用程序需要与多个宁静的api交谈,这将无法正常工作
  5. 查看JWT(pyjwtflask-jwt)令牌,它解决了上述所有问题以及更多问题。

答案 2 :(得分:2)

身份验证端点是/ login

查看flask-security here的代码,特别是views.py:_render_json()

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

问题(对我而言)就是要让它发挥作用。 对我来说request.json似乎是空的(因此工作)

{"email": "test@example.com", "password": "test123"}

希望这有助于你向前迈进一步。