如何实现 Python 用户登录 Token

在现代 Web 应用中,使用 Token 进行用户验证已经成为一种标准实践。Token 提供了一种更安全、可扩展的方式来处理用户身份验证。本文将会带你一步步实现一个简单的 Python 用户登录 Token 机制。

流程概述

要实现一个用户登录 Token 系统,我们可以总结如下的基本流程:

步骤 描述
用户注册 用户如果没有账号,需要注册一个账号。
用户登录 用户输入用户名和密码进行登录。
生成 Token 验证用户信息后,生成一个 Token 并返回给用户。
Token 验证 用户通过 Token 验证身份,进行受保护资源访问。
Token 刷新 如果 Token 过期,允许用户刷新 Token。

接下来,我们将逐步实现这个流程中的每一个步骤。

步骤实现

1. 用户注册

首先,我们需要一个简单的用户注册功能。我们将使用 Flask 框架来搭建一个简单的 Web 服务。

from flask import Flask, request, jsonify
from werkzeug.security import generate_password_hash

app = Flask(__name__)

users = {}  # 用字典存储用户信息

@app.route('/register', methods=['POST'])
def register():
    username = request.json.get('username')
    password = request.json.get('password')
    
    if username in users:
        return jsonify({"message": "User already exists!"}), 400

    # 将密码进行哈希处理后存储
    users[username] = generate_password_hash(password)
    return jsonify({"message": "User created successfully!"}), 201

代码注释:

  • Flask:一个轻量级的 Web 框架。
  • request:用于接收客户端的请求数据。
  • generate_password_hash:将密码加密存储,保持用户信息安全。
  • users:字典变量,存储用户名和加密后的密码。

2. 用户登录

接下来,我们实现用户的登录功能:

from werkzeug.security import check_password_hash
import jwt
import datetime

SECRET_KEY = "your_secret_key"  # JWT 密钥
@app.route('/login', methods=['POST'])
def login():
    username = request.json.get('username')
    password = request.json.get('password')

    user_password = users.get(username)

    if not user_password or not check_password_hash(user_password, password):
        return jsonify({"message": "Invalid credentials!"}), 401

    # 生成 Token
    token = jwt.encode({
        'username': username,
        'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=30)  # 设置过期时间
    }, SECRET_KEY, algorithm='HS256')

    return jsonify({"token": token}), 200

代码注释:

  • check_password_hash:验证用户输入的密码和存储的密码是否一致。
  • jwt.encode:生成 JWT Token,包含用户名和过期时间。
  • datetime.timedelta:设置 Token 过期时间。

3. Token 验证

为保护受限资源,我们需要实现一个 Token 验证的装饰器。

from functools import wraps

def token_required(f):
    @wraps(f)
    def decorated(*args, **kwargs):
        token = request.headers.get('Authorization')

        if not token:
            return jsonify({"message": "Token is missing!"}), 401
        
        try:
            data = jwt.decode(token, SECRET_KEY, algorithms=['HS256'])
            current_user = data['username']
        except:
            return jsonify({"message": "Token is invalid!"}), 401

        return f(current_user, *args, **kwargs)

    return decorated

@app.route('/protected', methods=['GET'])
@token_required
def protected(current_user):
    return jsonify({"message": f"Welcome {current_user}!"}), 200

代码注释:

  • token_required:装饰器,用于保护资源,验证 Token 的有效性。
  • jwt.decode:解码 Token,提取用户信息。

4. Token 刷新

最后,我们可以实现 Token 刷新功能,让用户在 Token 过期时能够获取新 Token。

@app.route('/refresh', methods=['POST'])
@token_required
def refresh(current_user):
    # 生成新的 Token
    new_token = jwt.encode({
        'username': current_user,
        'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=30)
    }, SECRET_KEY, algorithm='HS256')
    
    return jsonify({"token": new_token}), 200

代码注释:

  • 此函数允许用户在其 Token 过期后获取一个新的 Token。

类图

classDiagram
  class User {
    +username: str
    +password: str
    +register(): void
    +login(): str
    +verify_token(token: str): bool
  }

  class Token {
    +value: str
    +expiry: datetime
    +refresh(): str
  }

流程图

flowchart TD
    A[用户注册] -->|注册成功| B[用户登录]
    B -->|验证成功| C[生成 Token]
    C -->|返回 Token| D[保护资源访问]
    D -->|Token 验证| E[访问受保护资源]
    E -->|Token 刷新| F[继续访问]

结论

本文向你展示了如何使用 Python 和 Flask 实现一个简单的用户登录 Token 系统。我们经历了从用户注册、登录,到生成和验证 Token 的完整过程。使用 Token 可以增强应用的安全性,并为用户提供一种认证方法,使他们能够安全地访问受保护资源。希望这篇文章能够帮助你更好地理解和应用 Token 验证机制!如果你还有任何问题,请随时提出。