web-dev-qa-db-ja.com

ログインに必要なデコレータをFlask

2つのFlaskアプリ(異なるプロジェクト)が連携して動作します。1つは認証にトークンを使用するAPIを実装します。2つ目はAPIを使用して、そのためのWebインターフェイスを作成します。ユーザー名とパスワードをAPIに送信し、正しい場合は認証トークンを取得するログイン関数。トークンを取得したら、それをユーザーのセッションに保存すると、ユーザーはログイン/認証済みと見なされます。 。このような場合にlogin_requiredデコレータを実装するにはどうすればよいですか。

これが私のログイン機能です-

 def login(self):
        response = make_request(BASE_URL + 'login/', clean_data(self.data))
        if response.status_code == 200:
            session['auth_token'] = response.json().get('auth_token')
            return True
        return False

Login_requiredデコレータを作成するにはどうすればよいですか?

また、それが重要な場合は、Redisを使用してセッションを保存しています。

9
utkbansal

デコレータに関する公式のflaskドキュメントもご覧ください: http://flask.pocoo.org/docs/0.10/patterns/viewdecorators/ またはpythonドキュメント- https://www.python.org/dev/peps/pep-0318/ も同様です。

デコレータは次のようになります。

from functools import wraps
from flask import abort
import jwt

def authorize(f):
    @wraps(f)
    def decorated_function(*args, **kws):
            if not 'Authorization' in request.headers:
               abort(401)

            user = None
            data = request.headers['Authorization'].encode('ascii','ignore')
            token = str.replace(str(data), 'Bearer ','')
            try:
                user = jwt.decode(token, JWT_SECRET, algorithms=['HS256'])['sub']
            except:
                abort(401)

            return f(user, *args, **kws)            
    return decorated_function

...そしてあなたのapp.pyにあなたが持っているかもしれません:

@app.route('/api/game', methods=['POST'])
@authorize
def create(user):
    data = json.loads(request.data)
    ....

この特定のケースでは、トークンとしてJWTを使用しました。トークンはそれぞれ異なる可能性があり、トークンのデコードはカスタム実装にすることができますが、基本的なメカニズムは上記の例とほとんど同じです。

15
Velin Georgiev

後続の各リクエストにAPIトークンが含まれる場合、デコレータは次のことを行う必要があります

  • 一般的な要求を受け入れます。そのために* argsと** kargsを使用できます
  • ヘッダーからトークンを抽出し、dbに保存されているトークンと比較します(Redisではなく、生成されたトークンがバックエンドに保存されている場所)
  • 認証された場合、* argsと** kargsは装飾された関数に渡される必要があります
  • 装飾された関数の出力は、そのまま返されます。
  • 認証に失敗した場合は、エラーメッセージが返されます。

デコレータの説明については、次のリンクを確認してください: http://thecodeship.com/patterns/guide-to-python-function-decorators/

1
TheGeorgeous