CMDB之API验证
在CMDB项目中,数据通过requests模块POST到API以及中控机通过requests模块的GET请求拿取未采集信息的服务器列表,对于这种请求,毋庸置疑是需要验证的,来防止非法请求
那么如何验证,最容易想到的自然是token
版本一:
服务端存一个固定的token值,客户端在发送请求的时候携带这个token
# 这种方式虽然实现了一定程度的验证,但是显然不可能这么去做
版本二:
采取动态token的方式:
token的结构:加密过的信息|时间戳
原理:将时间戳及settings里的token值进行加密计算与发过来的yoken值比较
代码实现
服务端

TOKEN = "hello world"

def check_token(token): val, time = token.split("|") m = hashlib.md5() s = "%s|%s" % (settings.TOKEN, time) m.update(bytes(s,encoding="utf-8")) token = m.hexdigest() return True if val == token else False
客户端

def get_token(): m = hashlib.md5() now_time = time.time() setting_token = settings.TOKEN ls = "%s|%s"%(setting_token, now_time) m.update(bytes(ls,encoding="utf-8")) token = "%s|%s"%(m.hexdigest(), now_time) return token
# 这种方式仍然存在缺点,即使是N多年前的token,现在也能够使用
版本三:
容易想到,加个过期时间,在验证token值的之前,对时间戳进行判断,如果超过一定时间就直接return
# 这种方式的问题是,在过期之前,黑客拿到了token后仍然能够使用,
版本四:
保存使用信息,如果该token使用过就不让再次使用
需要维护一个列表,用于记录使用过的token,为了防止列表过大,可以删除过时的key
也可以使用redis,其自带过期时间设置
# 存在的问题:有没有可能在用户使用之前,黑客拿到token并使用
版本五:
使用AEX加密