欢迎访问宙启技术站
智能推送

Python中使用JWT进行用户登录和权限控制

发布时间:2023-12-27 05:34:42

在Python中,可以使用PyJWT库来使用JWT进行用户登录和权限控制。JWT(JSON Web Token)是一种开放的标准,用于在两个实体之间安全地传递信息。它由三部分组成:头部,负载和签名。

下面我们将演示如何在Python中使用JWT进行用户登录和权限控制的示例。

首先,我们需要安装PyJWT库。可以通过以下命令来安装:

pip install pyjwt

接下来,我们将演示一个简单的用户登录和权限控制的示例。

import jwt
import datetime
from functools import wraps
from flask import Flask, request, jsonify

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret_key'  # 设置密钥,用于签名和验证JWT

# 模拟用户数据库
users = {
    'user1': 'password1',
    'user2': 'password2'
}

# 登录路由,验证用户名和密码,生成JWT
@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:
        # 生成JWT
        token = jwt.encode({
            'username': username,
            'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=30)  # 设置token过期时间
        }, app.config['SECRET_KEY'])
        return jsonify({'token': token.decode('utf-8')})  # 返回生成的token
    else:
        return jsonify({'message': 'Invalid username or password'}), 401

# 权限控制装饰器
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:
            # 验证token
            data = jwt.decode(token, app.config['SECRET_KEY'])
            current_user = data['username']
        except:
            return jsonify({'message': 'Token is invalid'}), 401

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

    return decorated

# 受保护的路由,需要验证token
@app.route('/protected', methods=['GET'])
@token_required
def protected(current_user):
    return jsonify({'message': 'Welcome, {}! This is a protected resource.'.format(current_user)})

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

在这个示例中,我们创建了一个简单的Flask应用。首先,我们定义了一个用户数据库,模拟了用户的登录信息。然后,我们定义了一个登录路由/login,在该路由中,我们验证了用户输入的用户名和密码是否正确,并生成了一个JWT。

接下来,我们定义了一个权限控制装饰器token_required,该装饰器用于需要授权才能访问的路由。在装饰器中,我们首先获取请求头中的Authorization字段的值,即JWT。然后,我们使用jwt.decode()方法来验证JWT的有效性,并获取其中的用户名。

最后,我们定义了一个受保护的路由/protected,在该路由中,我们使用@token_required装饰器来实现权限控制。

要进行测试,可以使用Postman或其他HTTP客户端来发送HTTP请求。首先,发送一个POST请求到/login路由,包含一个JSON主体,例如:

{
  "username": "user1",
  "password": "password1"
}

该请求将返回一个包含JWT的JSON响应。然后,将该JWT作为请求头的Authorization字段的值发送GET请求到/protected路由,即可访问受保护的资源。

这个示例演示了如何在Python中使用PyJWT库进行用户登录和权限控制。JWT是一种非常方便和安全的身份验证和授权机制,能够在不同的应用之间安全地传递信息。