首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

python-jose,一个超可靠的 Python 库!

python-jose,一个超可靠的 Python 库!

大家好,我是猫哥!今天要介绍一个在Web开发中非常实用的Python库 - python-jose。它主要用于处理JWT(JSON Web Token)相关的加密和认证操作。如果你正在开发需要用户认证的Web应用或API接口,python-jose绝对是你的得力助手!它就像是一个可靠的保安,帮你管理用户的出入证,保证系统的安全性。

快速入门

首先安装python-jose:

pip install python-jose[cryptography]

来看一个最简单的例子:

from jose import jwt

# 创建一个JWT token

secret_key = "你的密钥"

data = {"user_id": 123, "username": "小明"}

token = jwt.encode(data, secret_key, algorithm='HS256')

print(f"生成的token: {token}")

# 解码JWT token

decoded = jwt.decode(token, secret_key, algorithms=['HS256'])

print(f"解码后的数据: {decoded}")

小贴士:JWT token看起来像一串乱码,实际上是由三部分组成的:header(头部)、payload(载荷)和signature(签名)。

JWT认证实战

1. 用户登录系统

from jose import jwt

from datetime import datetime, timedelta

import json

def create_access_token(data: dict, expires_delta: timedelta = None):

  """创建访问令牌"""

  to_encode = data.copy()

  # 设置过期时间

  if expires_delta:

      expire = datetime.utcnow() + expires_delta

  else:

      expire = datetime.utcnow() + timedelta(minutes=15)

  to_encode.update({"exp": expire})

  # 生成JWT token

  encoded_jwt = jwt.encode(

      to_encode,

      "你的密钥",

      algorithm='HS256'

  )

  return encoded_jwt

# 使用示例

user_data = {

  "user_id": 123,

  "username": "小明",

  "role": "user"

}

token = create_access_token(

  user_data,

  timedelta(hours=1)

)

print(f"登录令牌: {token}")

2. Token验证

from jose import jwt, JWTError

def verify_token(token: str):

  """验证访问令牌"""

  try:

      # 解码并验证token

      payload = jwt.decode(

          token,

          "你的密钥",

          algorithms=['HS256']

      )

      username = payload.get("username")

      if username isNone:

          raise ValueError("无效的token")

      return payload

  except JWTError:

      raise ValueError("token已过期或无效")

# 使用示例

try:

  user_info = verify_token(token)

  print(f"验证通过: {user_info}")

except ValueError as e:

  print(f"验证失败: {str(e)}")

高级特性

1. 使用不同的加密算法

from jose import jwt

# RSA加密

private_key = """

-----BEGIN PRIVATE KEY-----

你的私钥内容

-----END PRIVATE KEY-----

"""

public_key = """

-----BEGIN PUBLIC KEY-----

你的公钥内容

-----END PUBLIC KEY-----

"""

# 使用RSA算法加密

token = jwt.encode(

  {"user_id": 123},

  private_key,

  algorithm='RS256'

)

# 使用公钥验证

decoded = jwt.decode(

  token,

  public_key,

  algorithms=['RS256']

)

2. 自定义Claims验证

from jose import jwt, ExpiredSignatureError

def create_token_with_claims(user_data: dict):

  """创建带有自定义声明的token"""

  claims = {

      "iss": "my_app",  # 发行者

      "aud": "my_users",  # 接收者

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

      "user_data": user_data

  }

  return jwt.encode(claims, "密钥", algorithm='HS256')

def verify_token_claims(token: str):

  """验证带有自定义声明的token"""

  try:

      payload = jwt.decode(

          token,

          "密钥",

          algorithms=['HS256'],

          options={

              "verify_aud": True,

              "verify_iss": True

          }

      )

      return payload["user_data"]

  except ExpiredSignatureError:

      raise ValueError("token已过期")

实际应用示例

1. API认证中间件

from functools import wraps

from jose import jwt

def token_required(f):

  @wraps(f)

  def decorated(*args, **kwargs):

      token = None

      # 从请求头获取token

      if'Authorization'in request.headers:

          token = request.headers['Authorization'].split(" ")[1]

      ifnot token:

          return {'message': '缺少token'}, 401

      try:

          current_user = verify_token(token)

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

      except Exception as e:

          return {'message': '无效的token'}, 401

  return decorated

# 使用装饰器保护API接口

@token_required

def protected_api(current_user):

  return {'message': f'你好, {current_user["username"]}!'}

安全建议

密钥保护:永远不要将密钥硬编码在代码中

合适的过期时间:根据安全需求设置合理的token过期时间

错误处理:妥善处理所有可能的异常情况

算法选择:根据实际需求选择合适的加密算法

练习题

实现一个完整的用户登录注册系统,使用JWT进行身份验证

编写一个token刷新机制,在token即将过期时自动更新

实现基于角色的访问控制(RBAC)系统

小伙伴们,今天的Python学习之旅就到这里啦!记得动手敲代码,有问题随时在评论区问猫哥哦。祝大家学习愉快,Python学习节节高!

#Python学习 #python-jose #JWT认证 #Python编程

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OIBhZolrfuM4Vu7L1ZdFovew0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券