Flask RESTful API并为特定用户进行身份验证

时间:2015-08-29 20:46:44

标签: python rest flask restful-authentication flask-restful

我对RESTful API相对较新,所以我当然不能正确设计它。

我想根据正在进行身份验证的人从/ api / users / [user_id]返回JSON用户对象的不同子集。因此,如果用户" alice"正在尝试访问/ api / users / alice,她会获得更多她的信息(例如私人设置等),而不是用户" bob"谁只是得到她的公开形象。

我目前正在使用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注释。

我觉得这是一个非常常见的用例,所以我无法弄清楚为什么我在这方面找不到任何东西。我设计这个完全错了吗?

非常感谢!

1 个答案:

答案 0 :(得分:7)

我建议不要使用flask.ext.httpauth。我没有发现它非常有用。我使用一个装饰器,它接受Authorization标头并用db检查它。您可以访问在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)