17

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

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

根据文档:

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

但是,对于如何使用烧瓶安全性实现此功能,我仍然有些困惑。一些在线研究使我使用了诸如 @auth_token_required 之类的东西,但我在将所有内容放在一起时遇到了一些麻烦。烧瓶安全文档本身并不是很有帮助。

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

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

4

3 回答 3

20

端点是 /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');
            }
于 2015-03-27T15:12:54.250 回答
11

我发现 Flask-Security 的基于令牌的方法不适合我的项目。我建议改用 JWT 令牌。

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

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

查看 JWT(pyjwtflask-jwt)令牌,它解决了上述所有问题以及更多问题。

于 2016-07-21T00:15:47.093 回答
2

身份验证端点是 /login

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

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

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

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

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

于 2015-01-13T10:49:41.740 回答