我目前正在寻找一种使用基于令牌的身份验证来保护REST API的方法。我正在使用Flask在Python中开发API,并发现了flask-security扩展,它似乎有很多有趣的功能。
文档中提到的功能之一是令牌验证。
根据文件:
通过检索用户身份验证启用基于令牌的身份验证 通过执行带有身份验证详细信息的HTTP POST的令牌 针对身份验证端点的JSON数据。成功打电话给 此端点将返回用户的ID及其身份验证 令牌。此令牌可用于后续的受保护请求 资源。
然而,我仍然对如何使用flask-security实现此功能感到困惑。 一些在线研究让我使用了诸如@auth_token_required之类的东西,但我把所有东西放在一起都有些麻烦。烧瓶安全文档本身并没有多大帮助。
例如,用户如何获得身份验证令牌?什么是身份验证端点?
如果你能引导我朝着正确的方向前进,那就太好了。代码示例也很棒: - )
答案 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基于令牌的身份验证存在的问题。
答案 2 :(得分:2)
身份验证端点是/ login
查看flask-security here的代码,特别是views.py:_render_json()
login()调用_render_json,后者又调用get_auth_token() - 并返回身份验证令牌。
问题(对我而言)就是要让它发挥作用。 对我来说request.json似乎是空的(因此不工作)
{"email": "test@example.com", "password": "test123"}
希望这有助于你向前迈进一步。