In modernen Webanwendungen sind Benutzerauthentifizierung und -autorisierung sehr wichtige Sicherheitsmaßnahmen. Mit der Popularität und Verwendung von Python sind Flask-RESTful und Flask-JWT zu den bevorzugten Lösungen für die Benutzerauthentifizierung und -autorisierung in Python-Webanwendungen geworden. In diesem Artikel wird die Verwendung von Flask-RESTful und Flask-JWT sowie die Implementierung der Benutzerauthentifizierung und -autorisierung in Python-Webanwendungen ausführlich vorgestellt.
Einführung in Flask-RESTful
Flask-RESTful ist eine Erweiterungsbibliothek von Flask, die dabei helfen kann, schnell RESTful-API-Schnittstellen zu erstellen. Es bietet viele nützliche Funktionen, wie z. B. Eingabevalidierung, Anforderungsanalyse usw. Mit Flask-RESTful können wir ganz einfach eine einfache Web-API erstellen. Hier ist ein einfaches Beispiel:
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)
In diesem Beispiel erstellen wir eine Ressource mit dem Namen HelloWorld
und fügen sie dem api
-Objekt hinzu. Schließlich können wir über die Route /
auf die Ressource HelloWorld
zugreifen. Wenn wir auf die Route /
zugreifen, rufen wir die Methode get
der Ressource HelloWorld
auf und geben eine JSON-Antwort {'hello' zurück: 'Welt'
. 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
In diesem Beispiel definieren wir zunächst eineUser
-Klasse, um die Authentifizierungsinformationen des Benutzers zu speichern. Geben Sie in der Funktion authenticate
einen Benutzernamen und ein Passwort ein und die Funktion gibt ein Benutzerobjekt zurück. Geben Sie in der Funktion identity
eine JWT-Nutzlast ein, und die Funktion gibt ein Benutzerobjekt basierend auf der Benutzer-ID im JWT zurück. Durch den Aufruf des JWT
-Konstruktors fügen wir der Anwendung eine benutzerdefinierte Authentifizierungsmethode und eine benutzerdefinierte Benutzeridentifizierungsmethode hinzu. Schließlich wird der Dekorator @jwt_required
im Dekorator der Route protected
verwendet, um sicherzustellen, dass nur authentifizierte Benutzer auf geschützte Ressourcen zugreifen können. 🎜🎜Kombination aus Flask-RESTful und Flask-JWT🎜🎜Wir können Flask-RESTful und Flask-JWT zusammen verwenden, um eine vollständige Webanwendung zu implementieren, einschließlich Benutzerauthentifizierungs- und Autorisierungsmechanismen. Hier ist ein einfaches Beispiel: 🎜rrreee🎜In diesem Beispiel definieren wir zusätzlich zur Definition der Ressource HelloWorld
auch die Ressource Secret
und Login
Ressourcen. Übergeben Sie in der Ressource Secret
den Dekorator @jwt_required
, um sicherzustellen, dass nur authentifizierte Benutzer Zugriff haben. In der Ressource Login
analysieren wir die POST-Anfrage und verwenden die Funktion authenticate
, um die Identitätsinformationen des Benutzers zu überprüfen. Wenn die Überprüfung erfolgreich ist, wird das JWT-Token zurückgegeben, andernfalls wird ein 401-Statuscode zurückgegeben. Schließlich haben wir alle Ressourcen zum api
-Objekt hinzugefügt und die Webanwendung mit der run
-Methode von Flask gestartet. 🎜🎜Zusammenfassung🎜🎜Bei der Entwicklung von Python-Webanwendungen sind Flask-RESTful und Flask-JWT sehr nützliche Erweiterungsbibliotheken. Dadurch können wir ganz einfach Web-APIs erstellen und sichern sowie Benutzerauthentifizierungs- und Autorisierungsmechanismen zu Webanwendungen hinzufügen. Der Einsatz von Flask-RESTful und Flask-JWT kann unsere Entwicklungszeit und Entwicklungskosten reduzieren und uns die Implementierung der Funktionen von Webanwendungen erleichtern. 🎜Das obige ist der detaillierte Inhalt vonFlask-RESTful und Flask-JWT: Benutzerauthentifizierung und -autorisierung in Python-Webanwendungen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!