所有文章 > API安全 > PyJWT:轻松搞定Token认证,让你的API更安全!

PyJWT:轻松搞定Token认证,让你的API更安全!

大家好啊!今天我要跟小伙伴们分享一个特别实用的Python库 – PyJWT。在开发Web应用时,我们经常需要处理用户认证的问题。JWT(JSON Web Token)就是一个非常流行的解决方案,而PyJWT让我们可以轻松地在Python中使用JWT。

什么是JWT?

JWT可以理解为一个加密的信息包,就像是给用户发放的一个通行证。它由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。想象一下,它就像是一封带防伪印章的信,不仅包含了重要信息,还能验证这些信息是否被篡改。

安装PyJWT

首先,我们需要安装PyJWT库:

pip install PyJWT

创建JWT Token

让我们来看看如何创建一个JWT token:

import jwt

import datetime

# 定义密钥

SECRET_KEY = "your-secret-key"

# 创建token

def create_token(user_id):

    # 设置token的有效载荷

    payload = {

        'user_id': user_id,

        'exp': datetime.datetime.utcnow() + datetime.timedelta(days=1),  # 过期时间:1天

        'iat': datetime.datetime.utcnow()  # 发行时间

    }

    # 生成token

    token = jwt.encode(payload, SECRET_KEY, algorithm='HS256')

    return token

# 测试创建token

token = create_token(123)

print("生成的token:", token)

小贴士SECRET_KEY要保管好哦!它就像是你的保险箱密码,千万不能泄露。

验证JWT Token

有了token,当然要验证它是否有效:
def verify_token(token):

    try:

        # 验证token

        payload = jwt.decode(token, SECRET_KEY, algorithms=['HS256'])

        return payload

    except jwt.ExpiredSignatureError:

        return "Token已过期!"

    except jwt.InvalidTokenError:

        return "无效的Token!"

# 测试验证token

try:

    result = verify_token(token)

    print("解码后的数据:", result)

except Exception as e:

    print("验证失败:", str(e))

在Web应用中使用JWT

下面是一个使用Flask框架的简单示例:

from flask import Flask, jsonify, request

from functools import wraps

app = Flask(__name__)

# 验证token的装饰器

def token_required(f):

    @wraps(f)

    def decorated(*args, **kwargs):

        token = request.headers.get('Authorization')

        if not token:

            return jsonify({'message': '缺少token!'}), 401

        try:

            payload = verify_token(token)

            request.user = payload

        except:

            return jsonify({'message': 'token无效!'}), 401

        return f(*args, **kwargs)

    return decorated

# 登录接口

@app.route('/login', methods=['POST'])

def login():

    # 这里简化了登录逻辑

    user_id = 123

    token = create_token(user_id)

    return jsonify({'token': token})

# 需要验证token的接口

@app.route('/protected')

@token_required

def protected():

    return jsonify({'message': '你成功访问了受保护的接口!'})

注意事项

  1. token一般放在请求头的Authorization字段中
  2. 生产环境中要使用更安全的密钥
  3. 根据需求设置合适的token过期时间

实用小技巧

自定义载荷

# 添加更多自定义信息

payload = {

    'user_id': user_id,

    'username': 'python_lover',

    'role': 'admin',

    'exp': datetime.datetime.utcnow() + datetime.timedelta(days=1)

}

不同的加密算法

PyJWT支持多种加密算法:

# 使用RS256算法(非对称加密)

token = jwt.encode(payload, private_key, algorithm='RS256')

练习题

  1. 尝试创建一个包含用户角色信息的token
  2. 实现一个token刷新的功能
  3. 给token添加自定义的过期时间

小伙伴们,今天的Python学习之旅就到这里啦!记得动手敲代码,有问题随时在评论区留言哦。JWT的使用场景非常广泛,掌握了它,你就离成为后端高手更近一步啦!祝大家学习愉快,Python学习节节高!

文章转自微信公众号@黑发工程

#你可能也喜欢这些API文章!