基于业主集成需求,经常委托一家单位完成多家第三方单位的信息集成。本设计文档可作为一个通用设计方案,实现信息系统的集成对接。
这样可解耦集成方与被集成方, 实现双方各自的最大化扩展和最小化依赖。
http://_1_._2_._3_:_4_/third_visit?third_party_account=_5_&nonce=_6_&signature=_7_&user_account=_8_&next_url=_9_
_1_._2_._3_:_4_ 服务器地址和端口,被集成方提供,线下交换
_5_: 集成方在被集成系统里的账户, 被集成方提供,线下交换
_6_: 本次访问随机数
_7_: 本次签名
_8_: 当前用户帐户
_9_: url实际请求页面地址
每一个url请求都必须携带特定的安全信息,以便于双方进行授权验证。
安全信息参数包括:
third_party_account = request.query.third_party_account # 从url获取
nonce = request.query.nonce # 从url获取
signature = request.query.signature # 从url获取
token = get_token_by_third_party_account(third_party_account) # 根据集成方账户得到访问令牌(密码),线下交换
timestamp = datetime.datetime.now().strftime('%Y%m%d') # 从本机获取(年月日: 20200229)
target_string = ''.join(sorted([token, timestamp, nonce])) # 排序
expect_signature = hashlib.sha1(target_string.encode()).hexdigest() # sha1计算签名
valid_signature = (expect_signature == signature) # 比较签名
# 声明变量
third_party_account= "shtw"
nonce="04"
signature="1234"
token="shtw_experiment_2019"
timestamp="20190131"
# 计算签名
target_string = "0420190131shtw_experiment_2019"
expect_signature = "6ab540e713a6a06d9769903b774c35dff897e970" # 期望签名
valid_signature = (expect_signature == signature) # url携带签名是否等于期望签名
assertTrue(valid_signature)