如何实现 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 验证机制!如果你还有任何问题,请随时提出。