假设您已经有了一个基础的用户登录功能,并且现在要添加JWT生成与校验的部分。下面是一个结合了登录验证和JWT生成及校验的简化版Python后端示例:

pip install PyJWT

然后,可以按如下方式对登录功能进行封装:

import jwt
import time
from datetime import datetime, timedelta
from flask import Flask, request, jsonify
from werkzeug.security import check_password_hash

app = Flask(__name__)

# 假设我们有一个简单的用户数据库,这里仅模拟一个用户数据字典
users = {
    'john_doe': {'username': 'john_doe', 'password': 'hashed_password_here'}
}

# 秘钥用于签名JWT
SECRET_KEY = 'your-very-secret-key'

@app.route('/login', methods=['POST'])
def login():
    data = request.get_json()

    # 检查用户名是否存在以及密码是否匹配
    if data['username'] in users and check_password_hash(users[data['username']]['password'], data['password']):
        # 登录成功,创建JWT
        payload = {
            'username': data['username'],
            'iat': datetime.now(),
            'exp': datetime.now() + timedelta(hours=1)  # 设置token有效期为1小时
        }

        token = jwt.encode(payload, SECRET_KEY, algorithm='HS256')
        response = jsonify({'message': 'Login successful', 'access_token': token.decode('utf-8')})
        response.status_code = 200
        return response

    else:
        # 登录失败
        return jsonify({'message': 'Invalid credentials'}), 401

@app.route('/protected_route', methods=['GET'])
def protected_route():
    # 获取请求头中的Authorization字段中的JWT
    auth_header = request.headers.get('Authorization')
    if auth_header:
        try:
            token = auth_header.split(' ')[1]  # 获取Bearer后面的token字符串
            payload = jwt.decode(token, SECRET_KEY, algorithms=['HS256'])

            # 如果能正常解码,则认为Token有效,允许访问受保护资源
            return jsonify({'message': f'Welcome, {payload["username"]}'})

        except jwt.ExpiredSignatureError:
            return jsonify({'message': 'Token has expired'}), 401
        except jwt.InvalidTokenError:
            return jsonify({'message': 'Invalid token'}), 401

    # 若无有效token,拒绝访问
    return jsonify({'message': 'Missing or invalid token'}), 401

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

这个示例包括:

  1. 用户通过POST请求到/login接口提交其凭证(用户名和密码)。

  2. 服务器检查用户名和密码是否正确。

  3. 登录成功时,生成JWT并将其作为响应的一部分返回给客户端。

  4. 客户端在后续请求中将JWT放入请求头的Authorization字段(通常是"Bearer {token}"格式)。

  5. 受保护路由会在处理请求前先校验JWT的有效性,如果有效则允许访问,否则返回401 Unauthorized错误。