Maison >développement back-end >Tutoriel Python >Flask-RESTful et Flask-JWT : authentification et autorisation des utilisateurs dans les applications Web Python

Flask-RESTful et Flask-JWT : authentification et autorisation des utilisateurs dans les applications Web Python

WBOY
WBOYoriginal
2023-06-17 10:42:581671parcourir

Dans les applications Web modernes, l'authentification et l'autorisation des utilisateurs sont des mesures de sécurité très critiques. Avec la popularité et l'utilisation de Python, Flask-RESTful et Flask-JWT sont devenus les solutions privilégiées pour l'authentification et l'autorisation des utilisateurs dans les applications Web Python. Cet article présentera en détail l'utilisation de Flask-RESTful et Flask-JWT, et comment implémenter l'authentification et l'autorisation des utilisateurs dans les applications Web Python.

Introduction à Flask-RESTful

Flask-RESTful est une bibliothèque d'extensions de Flask qui peut aider à créer rapidement des interfaces API RESTful. Il fournit de nombreuses fonctions utiles, telles que la validation des entrées, l'analyse des requêtes, etc. Avec Flask-RESTful, nous pouvons facilement créer une API Web simple. Voici un exemple simple :

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)

Dans cet exemple, nous créons une ressource nommée HelloWorld et l'ajoutons à l'objet api . Enfin, nous pouvons accéder à la ressource HelloWorld via la route /. Lorsque nous accédons à la route /, nous appelons la méthode get de la ressource HelloWorld et renvoyons une réponse JSON {'hello' : 'monde'. HelloWorld的资源(Resource),并将其添加到了api对象中。最终,我们可以通过/路由来访问HelloWorld资源。当我们访问/路由时,调用HelloWorld资源的get方法,并返回一个JSON响应{'hello': 'world'}

Flask-JWT的介绍

Flask-JWT是Flask的另一个扩展库,用于在Web应用程序中实现JSON Web Token(JWT)身份验证。JWT是一个开放标准,用于在用户和服务器之间安全地传输信息。它是基于JSON的,通常由三个部分组成,分别是头部、载荷和签名。头部包含了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构造函数,我们为应用程序添加了一个自定义的身份验证方法和一个自定义的用户标识方法。最后,在protected路由的装饰器中使用了@jwt_required装饰器,以确保只有经过身份验证的用户才能访问受保护的资源。

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函数来验证用户的身份信息。如果验证成功,则返回JWT token,否则返回401状态码。最终,我们将所有的资源添加到了api对象中,并使用Flask的run

Introduction à Flask-JWT

Flask-JWT est une autre bibliothèque d'extensions pour Flask permettant d'implémenter l'authentification JSON Web Token (JWT) dans les applications Web. JWT est un standard ouvert permettant de transmettre en toute sécurité des informations entre les utilisateurs et les serveurs. Il est basé sur JSON et se compose généralement de trois parties, à savoir l'en-tête, la charge utile et la signature. L'en-tête contient le type JWT et les informations sur l'algorithme utilisé, la charge utile contient les informations sur les données qui doivent être transmises et la signature est utilisée pour vérifier si les données sont correctes. Flask-JWT simplifie la génération et la vérification de JWT, facilitant ainsi la mise en œuvre de l'authentification des utilisateurs dans les applications Web. Voici un exemple simple :

rrreee

Dans cet exemple, nous définissons d'abord une classe User pour stocker les informations d'authentification de l'utilisateur. Dans la fonction authentifier, entrez un nom d'utilisateur et un mot de passe, et la fonction renverra un objet utilisateur. Dans la fonction identity, entrez une charge utile jwt et la fonction renverra un objet utilisateur basé sur l'identifiant utilisateur dans le jwt. En appelant le constructeur JWT, nous ajoutons une méthode d'authentification personnalisée et une méthode d'identification utilisateur personnalisée à l'application. Enfin, le décorateur @jwt_required est utilisé dans le décorateur de la route protected pour garantir que seuls les utilisateurs authentifiés peuvent accéder aux ressources protégées. 🎜🎜Combinaison de Flask-RESTful et Flask-JWT🎜🎜Nous pouvons utiliser Flask-RESTful et Flask-JWT ensemble pour implémenter une application Web complète, y compris des mécanismes d'authentification et d'autorisation des utilisateurs. Voici un exemple simple : 🎜rrreee🎜Dans cet exemple, en plus de définir la ressource HelloWorld, nous définissons également la ressource Secret et Connexion Ressources. Dans la ressource Secret, transmettez le décorateur @jwt_required pour vous assurer que seuls les utilisateurs authentifiés y ont accès. Dans la ressource Login, nous analysons la requête POST et utilisons la fonction authenticate pour vérifier les informations d'identité de l'utilisateur. Si la vérification réussit, le jeton JWT est renvoyé, sinon un code d'état 401 est renvoyé. Enfin, nous avons ajouté toutes les ressources à l'objet api et démarré l'application Web à l'aide de la méthode run de Flask. 🎜🎜Résumé🎜🎜Dans le développement d'applications Web Python, Flask-RESTful et Flask-JWT sont des bibliothèques d'extensions très utiles. Grâce à eux, nous pouvons facilement créer et sécuriser des API Web et ajouter des mécanismes d'authentification et d'autorisation des utilisateurs aux applications Web. L'utilisation de Flask-RESTful et Flask-JWT peut réduire notre temps et nos coûts de développement, ce qui nous facilite la mise en œuvre des fonctions des applications Web. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn