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を使用してセッションを保存しています。
デコレータに関する公式の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を使用しました。トークンはそれぞれ異なる可能性があり、トークンのデコードはカスタム実装にすることができますが、基本的なメカニズムは上記の例とほとんど同じです。
後続の各リクエストにAPIトークンが含まれる場合、デコレータは次のことを行う必要があります
デコレータの説明については、次のリンクを確認してください: http://thecodeship.com/patterns/guide-to-python-function-decorators/