Flask RESTful API 并为特定用户进行身份验证
Flask RESTful API and authenticating for a specific user
我是 RESTful API 的新手,所以很可能我没有正确设计。
我想 return 根据身份验证者 /api/users/[user_id] JSON 用户对象的不同子集。因此,如果用户 "alice" 试图访问 /api/users/alice,她将获得比用户 "bob" 更多的信息(例如私人设置等),用户 "bob" 只会获取她的 public个人资料。
我目前正在使用 flask_restful 和 httpbasicauth。现在我有以下内容:
class UserAPI(flask_restful.Resource):
@g.auth.login_required
def get(self, username):
# here is where I want to get the HTTPBasicAuth username
# to determine how much data to return
user = User.objects(username=username).exclude('password').first()
if user is not None:
return user.to_json()
else:
flask_restful.abort(404, message='User not found: ' + username)
问题是我似乎无法找到一种干净的方法来获取 HTTP 基本身份验证数据。我知道我可以解析请求并解码 base-64 数据,但我觉得我不应该这样做。或者,更好的是,找到一种方法将 user_id 从 /api/users/[user_id] 传递到 login_required 注释中。
我觉得这是一个非常常见的用例,所以我不明白为什么我在这个区域找不到任何东西。我的设计完全错误吗?
非常感谢!
我建议不要使用 flask.ext.httpauth。我没有发现它很有用。我使用了一个装饰器,它接受授权 header 并用数据库检查它。您可以访问request.authorization.username中输入的用户名,密码在request.authorization.password.
中
from flask import request
from flask.ext.restful import abort, Resource
from functools import wraps
def requires_auth(f):
@wraps(f)
def decorated(*args, **kwargs):
auth = request.authorization
if not auth:
abort(401)
user = User.objects(username=auth.username).first()
auth_ok = False
if user != None:
auth_ok = verify_password(auth.password) == user.password
if not auth_ok:
return abort(401)
return f(*args, **kwargs)
return decorated
class UserAPI(Resource):
@requires_auth
def get(self):
user = User.objects(username=request.authorization.username).\
exclude('password').first()
if user is not None:
return user.to_json()
else:
abort(404, message='User not found: ' + username)
我是 RESTful API 的新手,所以很可能我没有正确设计。
我想 return 根据身份验证者 /api/users/[user_id] JSON 用户对象的不同子集。因此,如果用户 "alice" 试图访问 /api/users/alice,她将获得比用户 "bob" 更多的信息(例如私人设置等),用户 "bob" 只会获取她的 public个人资料。
我目前正在使用 flask_restful 和 httpbasicauth。现在我有以下内容:
class UserAPI(flask_restful.Resource):
@g.auth.login_required
def get(self, username):
# here is where I want to get the HTTPBasicAuth username
# to determine how much data to return
user = User.objects(username=username).exclude('password').first()
if user is not None:
return user.to_json()
else:
flask_restful.abort(404, message='User not found: ' + username)
问题是我似乎无法找到一种干净的方法来获取 HTTP 基本身份验证数据。我知道我可以解析请求并解码 base-64 数据,但我觉得我不应该这样做。或者,更好的是,找到一种方法将 user_id 从 /api/users/[user_id] 传递到 login_required 注释中。
我觉得这是一个非常常见的用例,所以我不明白为什么我在这个区域找不到任何东西。我的设计完全错误吗?
非常感谢!
我建议不要使用 flask.ext.httpauth。我没有发现它很有用。我使用了一个装饰器,它接受授权 header 并用数据库检查它。您可以访问request.authorization.username中输入的用户名,密码在request.authorization.password.
中from flask import request
from flask.ext.restful import abort, Resource
from functools import wraps
def requires_auth(f):
@wraps(f)
def decorated(*args, **kwargs):
auth = request.authorization
if not auth:
abort(401)
user = User.objects(username=auth.username).first()
auth_ok = False
if user != None:
auth_ok = verify_password(auth.password) == user.password
if not auth_ok:
return abort(401)
return f(*args, **kwargs)
return decorated
class UserAPI(Resource):
@requires_auth
def get(self):
user = User.objects(username=request.authorization.username).\
exclude('password').first()
if user is not None:
return user.to_json()
else:
abort(404, message='User not found: ' + username)