如何使用Flask-JWT實作基於JSON Web Token的身份驗證
概述:
在現代Web應用程式中,安全性是至關重要的。其中一個關鍵的方面就是身份驗證。 JSON Web Token(JWT)是一種用於在網路應用程式之間傳遞聲明的開放標準。它可以透過簽章來驗證資料的完整性,實現基於令牌的使用者身份驗證。
在本篇文章中,我們將介紹如何使用Flask-JWT擴充功能來實作基於JSON Web Token的身份驗證,以保護我們的Flask應用程式。
安裝Flask-JWT:
首先,確保你已經安裝了Flask和Flask-JWT。可以使用以下命令安裝它們:
pip install flask pip install flask-jwt
使用方式:
Flask-JWT提供了裝飾器,可以輕鬆地將令牌驗證新增至Flask路由函數。以下是一個簡單的範例:
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-key' class User: 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, 'admin', 'adminpassword'), ] def authenticate(username, password): user = next((user for user in users if user.username == 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 next((user for user in users if user.id == user_id), None) jwt = JWT(app, authenticate, identity) @app.route('/protected') @jwt_required() def protected(): return f'Hello, {current_identity}! This route is protected.' if __name__ == '__main__': app.run()
在上面的範例程式碼中,我們首先導入了所需的模組。然後,我們定義了一個User類別來表示使用者實體。接下來,我們定義了一個使用者清單(假設為資料庫),用於身份驗證。
authenticate函數用於根據提供的使用者名稱和密碼進行使用者身份驗證。 identity函數根據JWT載重中的使用者ID來取得使用者物件。
然後,我們初始化了一個Flask應用程序,並設定了一個秘鑰(SECRET_KEY)。然後,我們使用JWT類別初始化了一個jwt對象,並將authenticate和identity函數傳遞給它。
在/protected
路由上使用了@jwt_required()
裝飾器,用於保護該路由。只有經過身份驗證的用戶才能存取它。
最後,我們啟動了Flask應用程式。
進行身份驗證:
要進行身份驗證,我們需要向應用程式發出HTTP POST請求,傳遞使用者名稱和密碼。 Flask-JWT將為我們產生一個JWT令牌。
以下是如何進行身份驗證的範例程式碼:
import requests def authenticate(username, password): response = requests.post('http://localhost:5000/auth', json={'username': username, 'password': password}) if response.status_code == 200: return response.json()['access_token'] access_token = authenticate('admin', 'adminpassword') print(f'Access Token: {access_token}')
在上面的範例中,我們發送了一個HTTP POST請求到/auth
路由,傳遞了用戶名和密碼的JSON資料。如果身份驗證成功,我們將獲得一個access_token。
保護的路由將接受該令牌並驗證使用者身分。以下是如何在請求頭中傳遞令牌的範例:
import requests headers = { 'Authorization': f'Bearer {access_token}' } response = requests.get('http://localhost:5000/protected', headers=headers) print(response.text)
在上面的範例中,我們將令牌新增到請求頭的Authorization
欄位中,並將其傳遞給/protected
路由。如果令牌有效,我們將獲得受保護路由的回應。
總結:
在本篇文章中,我們學習如何使用Flask-JWT擴充來實作基於JSON Web Token的身份驗證。我們了解如何在Flask應用程式中新增身份驗證裝飾器,並透過範例程式碼示範如何進行身份驗證。 JSON Web Token提供了一個簡單且安全的身份驗證機制,可以應用於各種Web應用程式。
以上是如何使用Flask-JWT實作基於JSON Web Token的身份驗證的詳細內容。更多資訊請關注PHP中文網其他相關文章!