API 校验与失效策略

数据接口API简易校验策略

  • Client生成token
import hashlib
import string
import time
from urllib.parse import quote

import requests


host = 'http://0.0.0.0:3000'
app_key = ''      # 对应的用户key,作为API的参数进行传递
secret_key = ''   # 加密或解密共用的key


def generate_token_from(url_without_token, secret_key):
    str_content = (url_without_token + secret_key).encode()
    digest = hashlib.md5(str_content).hexdigest()
    return digest[:20]


def generate_token(url):
    ts = int(time.time())
    url_without_token = "{}&app_key={}&ts={}".format(url, app_key, ts)
    token = generate_token_from(url_without_token, secret_key)
    return url_without_token, token


def test():
    url = '/xxxx/stat'
    url = '{}?building={}'.format(url, '1号楼')
    # 如果url中包含有中文参数,则必须先进行转码,不然token校验会失败,safe则是对安全的字符不进行转码
    url = quote(url, safe=string.printable)
    url_without_token, token = generate_token(url)
    url = '{}{}&token={}'.format(host, url_without_token, token)
    print(url)
    resp = requests.get(url)
    print(resp.status_code)
    print(resp.text)


if __name__ == '__main__':
    test()
  • 过期失效策略
# time_stamp是从请求url中抽取的时间参数,进行与当前时间对比
def _is_url_not_expired(time_stamp):
    if not time_stamp.isdigit():
        return False

    validity_seconds = EXTERNAL_API_TOKEN_VALIDITY_SECONDS
    return abs(time.time() - int(time_stamp)) <= validity_seconds
  • 服务端token校验
# 获取client请求url,除去token参数,利用服务端secret_key重新生成token,与客户端token进行对比,一直这有效token,不一致则为无效token
def generate_token_from(url_without_token, secret_key):
    str_content = (url_without_token + secret_key).encode()
    digest = hashlib.md5(str_content).hexdigest()
    return digest[:20]

单点登录API校验策略

对于分布式web应用系统,传统的session校验策略则显得很无力,目前JWT校验机制在sso场景下较为流行,详细不做介绍,请查看博客详解:JWT详解

注意:两者的主要区别在我看其实JWT就是将一些用户私有数据封装成json进行了加密,服务端进行了decode,利用解析的参数进行校验,两者方案大同小异,主要是看使用场景选取合适的校验策略

你可能感兴趣的:(python)