python2 token和验证

python2 token和验证

生成token

# -*- coding: utf-8 -*-
import base64
import hmac
import time
import json

def generate_token(key, json_data=None, expire=15):
    """
    生成token
    :param key: 自定义key
    :param json_data: 需要传入的json数据,可以为空
    :param expire: 过期时间
    :return: token
    """
    if json_data is None:
        json_data = {}

    ts_str = str(time.time() + expire)
    ts_byte = ts_str.encode("utf-8")
    sha1_tshex_str = hmac.new(key.encode("utf-8"), ts_byte).hexdigest()
    token = ts_str + '|' + sha1_tshex_str + '|' + json.dumps(json_data)
    b64_token = base64.urlsafe_b64encode(token.encode("utf-8"))
    return b64_token

验证token

def certify_token(key, token):
    """
    验证token是否正确
    :param key: 自定义key和生成的key一致
    :param token: token字符串
    :return: (token是否正确, json数据)
    """
    token_str = base64.urlsafe_b64decode(token).decode('utf-8')
    token_list = token_str.split('|')
    if len(token_list) != 3:
        return False, {}
    ts_str = token_list[0]
    if float(ts_str) < time.time():
        return False, {}
    known_sha1_tsstr = token_list[1]
    sha1 = hmac.new(key.encode("utf-8"), ts_str.encode('utf-8'))
    calc_sha1_tsstr = sha1.hexdigest()
    if calc_sha1_tsstr != known_sha1_tsstr:
        # token certification failed
        return False, {}
    # token certification success
    sha2 = token_list[2]
    return True, json.loads(sha2)

使用举例

token1 = generate_token('aaa', json_data={"ab": "cd"})
print 'token1: ', token1
print 'certify_token: ', certify_token('aaa', token1)

返回值:
token1:  MTU5NDYxMDIyOC41MXxkY2M1OTk2MDUxOWFjYjI1MDkyZjQwMjMyZTI5NDVkMHx7ImFiIjogImNkIn0=
certify_token:  (True, {u'ab': u'cd'})

python2差异

python2 中不支持使用语法: hmac.new(key.encode(“utf-8”), ts_byte, ‘sha1’).hexdigest()
其中第三个参数需要是一个可被调用的参数, 'sha1’可以不填,默认调用 hashlib.md5, 网上查的一般无法在python2中直接使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值