最新の Web アプリケーションでは、ユーザーの認証と認可は非常に重要なセキュリティ対策です。 Python の人気と使用に伴い、Flask-RESTful と Flask-JWT は、Python Web アプリケーションでのユーザー認証と認可に推奨されるソリューションになりました。この記事では、Flask-RESTful と Flask-JWT の使用方法、および Python Web アプリケーションでユーザー認証と認可を実装する方法を詳しく紹介します。
Flask-RESTful の概要
Flask-RESTful は、RESTful API インターフェイスを迅速に構築するのに役立つ Flask の拡張ライブラリです。入力検証、リクエスト解析など、多くの便利な機能を提供します。 Flask-RESTful を使用すると、シンプルな Web API を簡単に構築できます。簡単な例を次に示します。
from flask import Flask from flask_restful import Resource, Api app = Flask(__name__) api = Api(app) class HelloWorld(Resource): def get(self): return {'hello': 'world'} api.add_resource(HelloWorld, '/') if __name__ == '__main__': app.run(debug=True)
この例では、HelloWorld
という名前のリソースを作成し、それをオブジェクトの api
に追加します。最後に、/
ルートを通じて HelloWorld
リソースにアクセスできます。 /
ルートにアクセスすると、HelloWorld
リソースの get
メソッドを呼び出し、JSON 応答 {'hello': 'world'} を返します。 ###。
from flask import Flask from flask_jwt import JWT, jwt_required, current_identity from werkzeug.security import safe_str_cmp app = Flask(__name__) app.config['SECRET_KEY'] = 'super-secret' class User(object): def __init__(self, id, username, password): self.id = id self.username = username self.password = password def __str__(self): return f"User(id='{self.id}', username='{self.username}')" users = [ User(1, 'user1', 'password'), User(2, 'user2', 'password') ] username_table = {u.username: u for u in users} userid_table = {u.id: u for u in users} def authenticate(username, password): user = username_table.get(username, None) if user and safe_str_cmp(user.password.encode('utf-8'), password.encode('utf-8')): return user def identity(payload): user_id = payload['identity'] return userid_table.get(user_id, None) jwt = JWT(app, authenticate, identity) @app.route('/protected') @jwt_required() def protected(): return {'hello': current_identity.username} if __name__ == '__main__': app.run(debug=True)
User クラスを定義します。
authenticate 関数にユーザー名とパスワードを入力すると、関数はユーザー オブジェクトを返します。
identity 関数に jwt ペイロードを入力すると、関数は jwt 内のユーザー ID に基づいてユーザー オブジェクトを返します。
JWT コンストラクターを呼び出すことにより、カスタム認証メソッドとカスタム ユーザー識別メソッドをアプリケーションに追加します。最後に、
@jwt_required デコレーターが
protected ルートのデコレーターで使用され、認証されたユーザーのみが保護されたリソースにアクセスできるようにします。
from flask import Flask from flask_restful import Resource, Api, reqparse from flask_jwt import JWT, jwt_required, current_identity from werkzeug.security import safe_str_cmp app = Flask(__name__) app.config['SECRET_KEY'] = 'super-secret' api = Api(app) class User(object): def __init__(self, id, username, password): self.id = id self.username = username self.password = password def __str__(self): return f"User(id='{self.id}', username='{self.username}')" users = [ User(1, 'user1', 'password'), User(2, 'user2', 'password') ] username_table = {u.username: u for u in users} userid_table = {u.id: u for u in users} def authenticate(username, password): user = username_table.get(username, None) if user and safe_str_cmp(user.password.encode('utf-8'), password.encode('utf-8')): return user def identity(payload): user_id = payload['identity'] return userid_table.get(user_id, None) jwt = JWT(app, authenticate, identity) class HelloWorld(Resource): def get(self): return {'hello': 'world'} class Secret(Resource): @jwt_required() def get(self): return {'secret': 'resource', 'user': current_identity.username} class Login(Resource): def post(self): parser = reqparse.RequestParser() parser.add_argument('username', type=str, help='Username cannot be blank', required=True) parser.add_argument('password', type=str, help='Password cannot be blank', required=True) args = parser.parse_args() user = authenticate(args['username'], args['password']) if user: return {'access_token': jwt.jwt_encode_callback({'identity': user.id})} else: return {'message': 'Invalid username or password'}, 401 api.add_resource(HelloWorld, '/') api.add_resource(Secret, '/secret') api.add_resource(Login, '/login') if __name__ == '__main__': app.run(debug=True)
HelloWorld リソースの定義に加えて、
Secret リソースと
Login# も定義します。 ##リソース。 Secret
リソースで @jwt_required
デコレータを渡して、認証されたユーザーのみがアクセスできるようにします。 Login
リソースでは、POST リクエストを解析し、authenticate
関数を使用してユーザーの ID 情報を確認します。検証が成功した場合は JWT トークンが返され、そうでない場合は 401 ステータス コードが返されます。最後に、すべてのリソースを api
オブジェクトに追加し、Flask の run
メソッドを使用して Web アプリケーションを開始しました。 概要
Python Web アプリケーション開発では、Flask-RESTful と Flask-JWT は非常に便利な拡張ライブラリです。これらを通じて、Web API を簡単に構築および保護し、Web アプリケーションにユーザー認証および認可メカニズムを追加できます。 Flask-RESTful と Flask-JWT を使用すると、開発時間と開発コストが削減され、Web アプリケーションの機能を実装しやすくなります。
以上がFlask-RESTful と Flask-JWT: Python Web アプリケーションでのユーザー認証と認可の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。