首頁 >後端開發 >Python教學 >Flask-RESTful和Flask-JWT:Python web應用程式中的使用者驗證和授權

Flask-RESTful和Flask-JWT:Python web應用程式中的使用者驗證和授權

WBOY
WBOY原創
2023-06-17 10:42:581696瀏覽

在現代的網路應用程式中,使用者身分驗證和授權是非常關鍵的安全措施。隨著Python的流行和使用,Flask-RESTful和Flask-JWT成為了Python Web應用程式中使用者身分驗證和授權的首選解決方案。本文將會詳細介紹Flask-RESTful和Flask-JWT的使用,以及如何在Python Web應用程式中實現使用者驗證和授權。

Flask-RESTful的介紹

Flask-RESTful是Flask的擴充庫,可以幫助快速建立RESTful的API介面。它提供了很多有用的功能,例如輸入驗證、請求解析等。透過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的資源(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方法啟動了Web應用程式。

總結

在Python Web應用程式開發中,Flask-RESTful和Flask-JWT是非常有用的擴充程式庫。透過它們,我們可以輕鬆地建立和保護Web API,並為Web應用程式添加使用者身份驗證和授權機制。使用Flask-RESTful和Flask-JWT可以減少我們的開發時間和開發成本,使得我們更容易實現Web應用程式的功能。

以上是Flask-RESTful和Flask-JWT:Python web應用程式中的使用者驗證和授權的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn