Maison >développement back-end >Tutoriel Python >Flask-RESTful et Flask-JWT : authentification et autorisation des utilisateurs dans les applications Web Python
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
rrreee
Dans cet exemple, nous définissons d'abord une classeUser
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!