ホームページ  >  記事  >  バックエンド開発  >  Flask-RESTful と Flask-JWT: Python Web アプリケーションでのユーザー認証と認可

Flask-RESTful と Flask-JWT: Python Web アプリケーションでのユーザー認証と認可

WBOY
WBOYオリジナル
2023-06-17 10:42:581657ブラウズ

最新の 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'} を返します。 ###。

Flask-JWT の紹介

Flask-JWT は、Web アプリケーションに JSON Web Token (JWT) 認証を実装するための Flask のもう 1 つの拡張ライブラリです。 JWT は、ユーザーとサーバー間で情報を安全に送信するためのオープン標準です。これは JSON に基づいており、通常はヘッダー、ペイロード、署名の 3 つの部分で構成されます。ヘッダーには使用される JWT タイプとアルゴリズム情報が含まれ、ペイロードには送信する必要があるデータ情報が含まれ、署名はデータが正しいかどうかを検証するために使用されます。 Flask-JWT は JWT の生成と検証を簡素化し、Web アプリケーションでのユーザー認証の実装を容易にします。簡単な例を次に示します。

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 ルートのデコレーターで使用され、認証されたユーザーのみが保護されたリソースにアクセスできるようにします。

Flask-RESTful と Flask-JWT の組み合わせ

Flask-RESTful と Flask-JWT を一緒に使用して、ユーザー認証および認可メカニズムを含む完全な Web アプリケーションを実装できます。以下は簡単な例です:

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。