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

Python中使用HTTPTokenAuth()进行身份验证的 实践

发布时间:2023-12-24 15:30:19

在Python中使用HTTPTokenAuth进行身份验证的 实践是使用Flask框架结合JWT(JSON Web Token)进行身份认证。JWT是一种安全的身份验证方法,它基于签名,在服务器和客户端之间进行传输。以下是一个使用HTTPTokenAuth进行身份验证的示例。

首先,安装所需的依赖项。我们需要安装Flask和PyJWT。您可以使用以下命令来安装它们:

pip install flask pyjwt

接下来,我们将创建一个基本的Flask应用程序,并添加一个/login路由来处理用户登录。在登录过程中,将生成一个JWT并将其作为响应返回给用户。

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

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret-key' # 密钥用于签名和验证JWT

@app.route('/login', methods=['POST'])
def login():
    username = request.json.get('username') # 获取通过POST发送的用户名和密码
    password = request.json.get('password')

    # 验证用户名和密码(此处省略)

    # 生成JWT
    token = jwt.encode({
        'username': username,
        'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=30) # 设置JWT到期时间
    }, app.config['SECRET_KEY'])

    return jsonify({'token': token.decode('UTF-8')}) # 将JWT作为响应返回给用户

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

接下来,我们将创建一个/protected路由,该路由将要求用户提供JWT以进行身份验证。我们将在此路由上实现HTTPTokenAuth来验证JWT并更具体地确定用户是否被授权访问保护的资源。

from flask import Flask, jsonify
from flask_httpauth import HTTPTokenAuth

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret-key' # 同样使用相同的密钥

auth = HTTPTokenAuth(scheme='Bearer') # 使用Bearer方案的HTTPTokenAuth

tokens = []

@auth.verify_token
def verify_token(token):
    if token in tokens:
        return True
    return False

@app.route('/protected')
@auth.login_required
def protected():
    return jsonify({'message': 'protected resource'}) # 用户已经通过验证,返回保护资源

@app.route('/logout')
@auth.login_required
def logout():
    tokens.remove(auth.token) # 删除已登录的令牌
    return jsonify({'message': 'logout successful'})

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

在上面的示例中,HTTPTokenAuth是从flask_httpauth模块中导入的。我们在/protected/logout路由上使用@auth.login_required装饰器来确保只有提供有效JWT的用户可以访问这些资源。

最后,我们将创建一个简单的测试脚本,以验证身份验证是否正常工作。

import requests

# 用户登录
response = requests.post('http://localhost:5000/login', json={'username': 'user1', 'password': 'pass1'})
token = response.json()['token']

# 使用JWT访问受保护的资源
headers = {'Authorization': f'Bearer {token}'}
response = requests.get('http://localhost:5000/protected', headers=headers)
print(response.json()) # {'message': 'protected resource'}

# 用户注销
response = requests.get('http://localhost:5000/logout', headers=headers)
print(response.json()) # {'message': 'logout successful'}

在测试脚本中,我们首先向/login路由发送用户名和密码以获取JWT。然后,我们将该JWT作为Bearer令牌附加到请求头中,并使用它来访问/protected路由。最后,我们向/logout路由发送相同的JWT来注销用户。

以上是使用HTTPTokenAuth进行身份验证的 实践示例。您可以根据您的需求和安全要求进行适当的修改和扩展。