首頁  >  文章  >  後端開發  >  如何使用Flask-JWT實作基於JSON Web Token的身份驗證

如何使用Flask-JWT實作基於JSON Web Token的身份驗證

PHPz
PHPz原創
2023-08-02 16:43:511238瀏覽

如何使用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中文網其他相關文章!

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