python+request 接口自动化 jwt Token封装实现

一、什么是Token

Token可以理解为一种特殊的加密密码或者暗号;只有暗号匹配才能通过,否则就是“敌人”;

我们在登录XX站点,XX系统都需要输入自己的用户名和密码;但是在接口调用过程中,为了账号加密安全性,不能明文将账号密码放入到请求体或请求头中;

所以需要一种加密方式—暗号,这种暗号格式可以自己定义,那么只有“自己人”知道;

从而达到加密安全调用和请求对方接口;

1、正常输入账号密码的请求过程:

      1)登录页面登录后,服务端会生成token返回给客户端并缓存;

      2)后续操作业务页面,会默认带上缓存的token;从而能对上暗号,实现正常的请求;

2、调用接口直接请求服务端,可以使用2中方法:

     1)调用登录接口后,获得返回的token,在后续请求头或者url中带上token;

     2)知道加密盐后,生成token,在接口请求中带上生成的token;

二、Token包含内容

Token的格式可以自行约定,如下就是一个较简单的Token

{
	"iss": "xx应用",
	"iat": 1702xxxxx,
	"jti": "0AC3291A-88E9-017D-DF00-9CE0ECC29446",
	"u": "admin",
	"c": "",
	"a": "Mysoft",
	"t": "xxxxxxxx"
}

Token为了安全性,一次生成的token只能使用一次,下次使用需要按照规则重新生成;所以在以上的token中加入了时间戳(iat)和 uuid(jti);

时间戳:是为了限制token有效期

uuid:是为了限制token使用次数,如果两次请求的id相同,那么服务端就会自动判断token无效;

所以我们自己要封装token,基于以上这个案例,我们需要每次动态生成时间戳和uuid

三、请求Token封装

如下是python代码实现的基于jwt的token封装:

token分为三部分:data(数据)、secret(盐)、algorithm(加密方式)

分四步实现:

1、准备data

2、替换时间戳和uuid

3、准备加盐,此为实现服务端约定好的秘钥

4、加密生成最终token

# jwt生成token
def newToken(tenantName):
    # 1、token格式模板
    ds = '{"iss": "xxx应用","iat": 1702xxxx,"jti": "0AC3291A-88E9-017D-DF00-9CE0ECCxxxxx","u": "admin","c": "","a": "Mxxxx","t": "ompseyxxxx"}'
    payload = json.loads(ds)  # 转换为json
    timestamp = time.time()  # 生成时间戳
    timestamp = round(timestamp)
    guid = uuid.uuid4()  # 生成guid
    # print(guid)
    # 2、替换模板中的值
    payload['iat'] = timestamp  # 修改时间戳
    payload['jti'] = str(guid)  # 修改随机guid
    payload['t'] = tenantName  # 修改租户
    # print(payload)
    # print(type(payload))
    # payload = json.dumps(data)
    # 3、加盐
    secret = 'ff483a6526xxxxxx5'
    # 4、加密生成token
    token = jwt.encode(payload, secret, algorithm='HS256')
    # print(token)
    # Authorization = 'Bearer '+token
    return token

首先,需要安装 `djangorestframework` 和 `djangorestframework-jwt` 库: ``` pip install djangorestframework pip install djangorestframework-jwt ``` 然后在 Django 项目的 `settings.py` 文件中添以下配置: ```python INSTALLED_APPS = [ # ... 'rest_framework', 'rest_framework.authtoken', 'rest_framework_jwt', # ... ] REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.BasicAuthentication', ), } JWT_AUTH = { 'JWT_SECRET_KEY': 'your-secret-key', 'JWT_ALGORITHM': 'HS256', 'JWT_ALLOW_REFRESH': True, 'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=7), 'JWT_AUTH_HEADER_PREFIX': 'Bearer', } ``` 其中,`JWT_SECRET_KEY` 是一个随机字符串,用于密生成 JWT token。 接下来,在 Django 项目的 `urls.py` 文件中添以下代码: ```python from rest_framework_jwt.views import obtain_jwt_token, refresh_jwt_token, verify_jwt_token urlpatterns = [ # ... path('api-token-auth/', obtain_jwt_token), path('api-token-refresh/', refresh_jwt_token), path('api-token-verify/', verify_jwt_token), # ... ] ``` 这里添了三个路由,用于获取、刷新、验证 JWT token。 最后,为需要登录认证的接口添装饰器,例如: ```python from rest_framework.decorators import api_view, permission_classes from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response @api_view(['GET']) @permission_classes([IsAuthenticated]) def my_view(request): content = {'message': 'Hello, World!'} return Response(content) ``` 这里使用了 `@permission_classes([IsAuthenticated])` 装饰器,表示只有通过 JWT token 认证的用户才能访问该接口。 至此,我们完成了 Django DRF 框架的 JWT 登录认证接口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值