使用 Python Flask 实现 Token 认证示例

引言

在现代 Web 开发中,认证与授权是重要的课题之一。“Token 认证”是一种常用的身份验证方法,它通过分发一个临时的令牌(Token)来确保用户的身份。Python 的 Flask 框架提供了一个灵活而强大的方式来实现这一功能。本文将深入探讨如何在 Flask 中实现 Token 认证,并通过一个简单的示例为您进行详细说明。

什么是 Token 认证?

Token 认证是一种机制,它颁发一个由服务器生成的 Token 给客户端,客户端在后续请求中携带该 Token,服务器通过验证该 Token 来确定用户身份。与传统的 Cookie 认证方式相比,Token 认证的优势在于无状态性和跨域支持。

Token 认证的流程

Token 认证主要包括以下几个步骤:

  1. 用户通过提供凭证(如用户名和密码)进行登录。
  2. 服务器验证凭证,若验证成功,则生成一个 Token 并将其返回给客户端。
  3. 客户端在随后的每个请求中将 Token 发送给服务器,以证明其身份。
  4. 服务器验证 Token 的有效性,以决定用户是否可以执行请求的操作。

使用 Flask 实现 Token 认证

环境准备

首先,确保你已经安装了 Flask 和 Flask-JWT-Extended。可以使用以下命令安装:

pip install Flask Flask-JWT-Extended

创建 Flask 应用

下面我们来创建一个简单的 Flask 应用,使用 Token 进行用户认证。

from flask import Flask, jsonify, request
from flask_jwt_extended import JWTManager, create_access_token, jwt_required, get_jwt_identity

app = Flask(__name__)

# 配置 JWT 密钥
app.config['JWT_SECRET_KEY'] = 'your_secret_key'  # 要更换成你自己的密钥
jwt = JWTManager(app)

# 假设我们有一个用户数据库
users = {
    "user1": "password1",
    "user2": "password2"
}

@app.route('/login', methods=['POST'])
def login():
    username = request.json.get('username')
    password = request.json.get('password')

    if username in users and users[username] == password:
        access_token = create_access_token(identity=username)
        return jsonify(access_token=access_token), 200
    return jsonify({"msg": "Bad username or password"}), 401

@app.route('/protected', methods=['GET'])
@jwt_required()
def protected():
    current_user = get_jwt_identity()
    return jsonify(logged_in_as=current_user), 200

if __name__ == '__main__':
    app.run()

代码解析

  1. 配置 JWT 密钥:使用 app.config['JWT_SECRET_KEY'] 设置一个密钥,用于加密 JWT Token。

  2. 用户登录接口:在 /login 路由中,客户端提交用户名和密码。若验证通过,则调用 create_access_token 生成 Token,并将其返回。

  3. 受保护的路由:在 /protected 路由中,使用 @jwt_required() 装饰器来保护该接口。只有在请求中携带有效 Token 的用户才能访问该接口。

测试 Token 认证

我们可以使用 Postman 或 cURL 工具测试这个应用。以下是一些示例请求:

1. 用户登录

发送 POST 请求到 /login

curl -X POST  -H "Content-Type: application/json" -d '{"username":"user1", "password":"password1"}'

成功登录后,响应将包含一个 Token:

{
    "access_token": "your_jwt_token_here"
}

2. 访问受保护的路由

使用获取的 Token 访问 /protected 路由:

curl -X GET  -H "Authorization: Bearer your_jwt_token_here"

若 Token 有效,将返回当前用户的信息:

{
    "logged_in_as": "user1"
}

序列图

为了更好地理解 Token 认证的流程,下面是一个序列图,展示了用户、Flask 应用和数据库之间的交互过程。

sequenceDiagram
    participant User
    participant FlaskApp
    participant Database

    User->>FlaskApp: POST /login (username, password)
    FlaskApp->>Database: Verify username and password
    Database-->>FlaskApp: User valid
    FlaskApp-->>User: Return access_token

    User->>FlaskApp: GET /protected (Authorization: Bearer token)
    FlaskApp->>Database: Verify token
    Database-->>FlaskApp: Token valid
    FlaskApp-->>User: Return user information

结论

Token 认证是现代 Web 应用中一种高效且安全的用户身份验证方式。通过 Flask 和 Flask-JWT-Extended 库,我们可以轻松实现 Token 认证。当用户登录时,我们为其生成一个 Token,后续请求中只需携带该 Token 即可进行身份验证。

这种方法不仅提高了安全性,还使得前后端分离架构的实现变得更加简单。希望本文的示例和讲解能够帮助你在自己的项目中顺利实现 Token 认证。无论是构建 API 还是 Web 应用,掌握 Token 认证的实现对于大多数开发者来说都是一项必不可少的技能。