2015-08-29 3 views
0

Я относительно новичок в RESTful API, поэтому, конечно, я не могу это правильно разработать.Flask RESTful API и аутентификация для определенного пользователя

Я хочу вернуть разные подмножества пользовательского объекта JSON из/api/users/[user_id] на основе того, кто аутентифицируется. Поэтому, если пользователь «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 базовой аутентификации данных. Я знаю, что могу разобрать запрос и декодировать данные базы-64, но я чувствую, что мне не нужно это делать. Или, еще лучше, найдите способ передать user_id из/api/users/[user_id] в аннотацию login_required.

Я чувствую, что это будет очень распространенный случай использования, поэтому я не могу понять, почему я не могу найти что-либо в этой области. Я это совершенно неправильно?

Большое спасибо!

ответ

7

Предлагаю не использовать flask.ext.httpauth. Я не счел это очень полезным. Я использую декоратор, который берет заголовок авторизации и проверяет его с помощью 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) 
+0

Большое спасибо! Не знал о поле request.authorization: / – DanB91

Смежные вопросы