Heim  >  Artikel  >  Backend-Entwicklung  >  Flask-RESTful und Flask-JWT: Benutzerauthentifizierung und -autorisierung in Python-Webanwendungen

Flask-RESTful und Flask-JWT: Benutzerauthentifizierung und -autorisierung in Python-Webanwendungen

WBOY
WBOYOriginal
2023-06-17 10:42:581668Durchsuche

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

Einführung in Flask-JWT

Flask-JWT ist eine weitere Erweiterungsbibliothek für Flask zur Implementierung der JSON Web Token (JWT)-Authentifizierung in Webanwendungen. JWT ist ein offener Standard zur sicheren Übertragung von Informationen zwischen Benutzern und Servern. Es basiert auf JSON und besteht in der Regel aus drei Teilen, nämlich Header, Payload und Signatur. Der Header enthält die verwendeten JWT-Typ- und Algorithmusinformationen, die Nutzlast enthält die zu übertragenden Dateninformationen und die Signatur wird verwendet, um zu überprüfen, ob die Daten korrekt sind. Flask-JWT vereinfacht die Generierung und Überprüfung von JWT und erleichtert so die Implementierung der Benutzerauthentifizierung in Webanwendungen. Hier ist ein einfaches Beispiel:

rrreee

In diesem Beispiel definieren wir zunächst eine User-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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn