最近需要为系统添加三方应用接入的功能,对接入的三方应用允许获取用户的部分信息——但显然,不能将用户的账号、密码暴露给三方应用。这个过程中产生了一些思考,在此简单记录下。如果要一句话总结的话,就是:多学知识,学习前人的成果。
三方应用接入需要解决的问题
三方应用接入关键的是服务端能够识别请求来源,判断是否是已授权的三方应用,所以这首先是一个身份识别的问题。
第二个隐含的问题是系统权限设计的问题:三方应用使用用户个人数据,是否需要用户的授权。通常这是必须的,但这次系统中面向的是内部管理应用子系统的接入授权问题,认为内部数据流转不需要此流程。
身份识别那么可以使用公钥私钥——但是这样,对于服务端就需要保存所有三方应用的公钥。那么也可以按照这种思路,使用一种更轻的方式:为每个合法的三方应用分配一个ID和secret密钥,三方应用请求时使用secret对内容进行签名,服务端验证签名,则可以识别请求来源的合法性。
基于这一思路,可以设计出一种方式:
- 服务端为三方应用分配一个可公开的ID、一个不可公开的secret
- 三方应用使用secret对ID签名得到sign,携带自身ID与sign向服务端请求一个随机数(面向管理端子系统,默认用户同意授权),这一随机数和三方应用ID一一对应、在一定时间内有效
- 三方应用使用secret对随机数及时间戳签名,携带签名、时间戳和自身ID发起请求
- 服务端校验根据三方应用ID、随机数验证签名,并比对入参时间戳限制请求发起时间,从而确认请求来自合法的三方应用
这里身份认证的可信来自于签名算法的单向和secret的私密——但也并不是非常完善的,尤其是与OAuth协议的流程对比之后。不过,稍进一步分析之后也几乎可以得到结论是,不使用https(或者类似https的非对称、对称组合)的情况下,怎么做也不安全。