zoukankan      html  css  js  c++  java
  • python 产生token及token验证

     

     

    1.产生token

    原理:

    通过hmac sha1 算法产生用户给定的key和token的最大过期时间戳的一个消息摘要,
    将这个消息摘要和最大过期时间戳通过":"拼接起来,再进行base64编码,生成最终的token

    实现:

    import time
    import base64
    import hmac
    
    def generate_token(key, expire=3600):
        r'''
            @Args:
                key: str (用户给定的key,需要用户保存以便之后验证token,每次产生token时的key 都可以是同一个key)
                expire: int(最大有效时间,单位为s)
            @Return:
                state: str
        '''
        ts_str = str(time.time() + expire)
        ts_byte = ts_str.encode("utf-8")
        sha1_tshexstr  = hmac.new(key.encode("utf-8"),ts_byte,'sha1').hexdigest() 
        token = ts_str+':'+sha1_tshexstr
        b64_token = base64.urlsafe_b64encode(token.encode("utf-8"))
        return b64_token.decode("utf-8")
    

    2.验证token

    原理:

    将token进行base64解码,通过token得到token最大过期时间戳和消息摘要。判断token是否过期。
    如没过期才将 从token中的取得最大过期时间戳进行hmac sha1 算法运算(注意这里的key要与产生token的key要相同),
    最后将产生的摘要与通过token取得消息摘要进行对比, 如果两个摘要相等,则token有效,否则token无效 。

    实现:

    import time
    import base64
    import hmac
    
    def certify_token(key, token):
        r'''
            @Args:
                key: str
                token: str
            @Returns:
                boolean
        '''
        token_str = base64.urlsafe_b64decode(token).decode('utf-8')
        token_list = token_str.split(':')
        if len(token_list) != 2:
            return False
        ts_str = token_list[0]
        if float(ts_str) < time.time():
            # token expired
            return False
        known_sha1_tsstr = token_list[1]
        sha1 = hmac.new(key.encode("utf-8"),ts_str.encode('utf-8'),'sha1')
        calc_sha1_tsstr = sha1.hexdigest()
        if calc_sha1_tsstr != known_sha1_tsstr:
            # token certification failed
            return False 
        # token certification success
        return True 
    

    3.用法

    
    key  = "JD98Dskw=23njQndW9D"
    # 一小时后过期
    token = generate_token(key, 3600)
    
    certify_token(key, token)
    
    

    4.Note!!!

    本代码只能在python3.x 中运行,

     

    http://www.cnblogs.com/whereareyoufrom/p/5753365.html

     

  • 相关阅读:
    Django学习笔记(16)——扩展Django自带User模型,实现用户注册与登录
    Django学习笔记(15)——中间件
    JAVA—API和SPI概念
    mybatis 映射器(mappers) 配置说明 加载映射文件方式
    Java的三种代理模式
    如何选择分布式事务形态(TCC,SAGA,2PC,补偿,基于消息最终一致性等等)
    什么是分布式系统中的幂等性
    js date 前一天
    getCanonicalFile与getAbsoluteFile区别
    Mybatis 示例之 SelectKey
  • 原文地址:https://www.cnblogs.com/zhaohuanhuan/p/10484720.html
Copyright © 2011-2022 走看看