使用新浪微博开放平台api同步微博内容至自己网站(基于python的开放平台签名、加密解密以及授权认证测试体系)
优采云 发布时间: 2021-10-10 21:05使用新浪微博开放平台api同步微博内容至自己网站(基于python的开放平台签名、加密解密以及授权认证测试体系)
目前,大型顶级公司拥有非常成熟的开放平台服务,如微信开放平台、新浪微博开放平台、支付宝开放平台等。开放平台的发展为第三方个人或公司提供了巨大的机会。开发者想要接入各大开放平台,必须遵守开放平台的安全机制,实现业务逻辑的前提。一是实现签名验证、加解密、授权鉴权机制。
本文介绍了基于python的开放平台签名认证测试系统,可用于第三方应用的沙箱测试,也可应用于服务商相关系统的综合测试。
一、简介
开放平台是指大型企业以业务+场景+解决方案+技术的优势,将自身的数据能力、计算能力、用户系统、产品能力等资源打包,通过openAPI、openSDK等方式向第三方个人或个人开放,和 openH5。企业使用,实现第三方与服务商企业自身的互利共赢。
目前各大厂商的开放平台都比较成熟,如微信开放平台、新浪微博开放平台、支付宝开放平台等。与此同时,各大商业银行也在大力发展自身的开放银行服务。作为第三方开发者,一般来说,接入开放平台有一个相对统一的流程。下图为微信开放平台开通流程。
图1 微信开放平台接入流程
如图1第三步所示,应用上线前,必须进行必要的测试。业务逻辑测试的前提是测试签名验证、加解密、授权认证等安全认证机制。python社区非常成熟,广泛应用于机器学习、数据分析、网络爬虫、自动化脚本等诸多领域。
在web开发方面,目前有很多公司如Instagram、Quora、Lyft、Dropbox、知乎等后端使用python进行开发。本文介绍了基于python的签名验证、加解密、授权认证测试的实现。
二、签名验证
第三方个人或企业通过开放平台门户网站提交申请成为开发者。开发者资质认证通过后,开发者通常会从服务商处获得自己的appid、appsecret和证书。该证书收录第一个 第三方开发者的私钥和服务提供者的公钥。
服务提供商保留第三方开发者的公钥和自己的私钥。开发者使用自己的私钥进行签名,并将消息发送到开放平台服务器。服务器验证通过后,会使用自己的私钥对返回给开发者的消息进行签名,开发者收到返回消息后,使用服务方提供的公钥进行验证。通过这个过程,开发者和服务端可以相互确认发送的消息没有被中间人篡改。
本文的签名验证使用RSA算法进行演示。使用Python的Crypto库,安装时需要使用pip或conda等其他包管理工具。
一般来说,开发者需要对消息的每个字段进行预处理。
1.去除请求字典中的所有空值或不必要的参数(如sign、sign_type等);
2. 对字典进行排序(按照ASCII码从小到大);
3. 按照“参数=参数值”的模式,将字典中的所有元素用“&”字符组合成一个字符串。
数据预处理功能如下图所示:
图2 数据预处理功能
当开发者发送消息时,会使用Hash函数从消息中生成摘要,然后用私人消息对摘要进行加密。加密后的摘要用作消息的数字签名,并与消息一起发送到服务器。下图展示了RSA算法的签名函数的实现:
图3 数字签名功能
首先使用hash_method函数选择要使用的digest算法,可以根据实际情况重构函数。这里演示了 MD5 和 SHA256 算法的示例。签名函数首先要读取开发者的私钥,然后使用RSA算法完成签名。
开发者收到服务器返回的消息后,使用相同的Hash函数从接收到的原创消息中计算出消息的摘要,然后使用发送方的公钥对消息所附的数字签名进行解密,如果两个摘要是一致,开发者可以确认消息是服务器发送的,没有被篡改。
图4 签名验证功能
三、加解密
除了用于数字签名之外,RAS 算法还可以用于消息的非对称加密。非对称加密比对称加密更安全,但由于算法强度比对称加密复杂,因此加解密速度比对称加密慢。对称加密算法的特点是计算量小、加密速度快、加密效率高。缺点是交易双方使用相同的密钥,无法保证安全。常见的对称加密算法有DES、AES等。
在互联网上传输消息时,要保证信息的安全,保证没有高延迟。因此,对称加密算法和非对称加密算法通常结合使用。使用非对称加密算法对对称加密算法使用的密钥进行数字签名和加密传输,然后使用对称加密算法对消息进行加密和解密,保证了消息传输的安全性和消息的传输速度改善用户体验。
下面介绍AES加解密的python实现。其他加密算法类似。您可以根据服务方的要求选择使用哪种算法。AES 加密方式有五种:ECB、CBC、CTR、CFB、OFB。最常用的是CBC加密。CBC 加密需要一个 16 位的密钥和一个 16 位的偏移量。开发者使用服务器提供的appsecret作为加解密密钥。具体实现如下图所示:
图5 AES加解密
加密的数据应与签名一起发送到服务器。通常,消息是否使用对称加密是可选的。开发者可以根据开放平台的规定和交易的重要性来选择是否加密。
四、授权
各大开放平台都有自己的授权认证机制,最流行的机制是OAuth2.0。OAuth2.0 是一种开放的授权标准,允许用户授权第三方应用访问用户在某个服务(如微博、微信、QQ等)上的特定私有资源,而无需提供帐户密码给第三方。对于第三方应用,无需为第三方应用注册账号。如果要进行开放平台授权认证测试,必须按照OAuth2.0标准连接服务方。一般来说,服务提供者提供授权服务,主要提供两类接口:
1.授权接口:接受第三方应用的授权请求。该接口通常收录以下参数:
response_type:必需。该值固定为“代码”。
client_id:必需。第三方应用的标识ID,即appID。
状态:可选。第三方提供的字符串,服务器将原样返回。
redirect_uri:必需。授权成功后的重定向地址。
范围:可选。表示要访问的资源的授权范围。
成功访问该接口后,将获得一个授权码。
2.获取访问令牌(token)接口:使用授权接口提供的授权码向第三方应用发放访问令牌。通常收录以下参数:
grant_type:必需。固定值“authorization_code”。
代码:必填。授权码在授权界面响应。
redirect_uri:必需。必须与授权接口中提供的redirect_uri相同。
client_id:必需。必须与授权界面提供的appID一致。
第三方应用获得令牌后,可以使用令牌请求用户授权其访问服务端存储的资源。
以上接口的请求可以自己编码实现。Python的django-allauth库封装了GitHub、Twitter、微博、微信、百度等数十种第三方授权认证方式,通过简单的配置即可应对各大厂商开放平台的授权认证测试。下图展示了如何在django应用中注册django-allauth第三方登录服务。
图6 使用django-allauth库完成第三方授权登录
五、总结
本文介绍了使用python连接各大开放平台实现签名验证、加解密、授权认证的测试方法,并给出了详细的例子。开发者可以将上述方法封装到django或其他框架的web应用中,形成便于测试人员操作的界面。在处理签名验证、加解密、授权认证等测试或开发工作时,可以大大提高工作效率。
我是谁?
我是一名资深的测试人员,从事软件测试工作多年。今年年初花了一个月时间整理了一份2020年最适合学习的软件测试学习干货,可以送给每一个对软件测试感兴趣的小伙伴。想要领取的话,可以关注我的头条号,后台给我发私信:【测试】,免费领取。