第三方中的appkey、appSecret等的操作联系

在iOS开发中,经常的会有在APP间跳转的需求,最常见的就是微信、QQ、微博等的第三方分享、登录啊之类的。

在这个交互的过程中,有以下几种角色:

  • 自己所属的公司,姑且叫第一方吧,开发APP产品提供给别人使用,提供给别人服务;
  • 使用第一方产品的客户,姑且就叫做第二方吧;
  • 第三方,这个就是大家很熟悉的了,比如微信、微博、QQ等平台,提供给各个公司以登录、支付等服务,就算是我们口中常说得第三方。

程序标识

在这个过程中,最常见的有两个字符串:

  • appkey

    每个公司、团体、个人为自己的APP在第三方平台申请到的一个唯一的标识。
    第三方生成的这个标识必须是一个有意义的、唯一的字符串。

  • appSecret

    第三方在生成appkey的时候,同时生成的一个字符串,他俩一一对应,并且有意义、唯一。
    用于一些加密信息的验证,看名字也看的出来,这是一个需要保密的内容,一般都是只有开发方自己知道,不会向社会泄露的一项。

执行流程

经常使用的步骤如下:

  1. URL Types中添加第三方申请的appkey,一般都会按照第三方的要求去拼接一下,比如QQ的,会是tencent+appkey,微信的是wx+appkey,注意,不同平台都会有不同的前缀。
    在代码中需要首先向第三方的SDK注册,传递过去自己的appkeyappSecret,提供给第三方使用,用作后续的消息验证。

  2. 当用户有操作需求的时候,会在代码中向第三方的SDK发起一个操作需求的操作请求。

  3. 第三方的SDK需要在本地验证一下一些开发者参数是否有效,是否安装了第三方的APP等

  4. 第三方的SDK收到这个请求以后,会做以下的事:

  • 拼接一些验证的信息,比如获取当时的一个时间戳t、获取一个随机值r,然后拿appSecrettr三个参数做一系列的加密操作,得到一个不可逆的字符串,就记做是sec

  • 组装数据,把用户需求的一些参数、文件等组装,获得的trappSecretappkey等参数组装,可以把系统的粘贴板作为一个数据的中转站暂存一下数据,或者说数据只是字符串等少量数据的话,可以直接拼接url也可以。

    在这里传入时间戳,是有意义的,比如后台在收到这个请求的时候,拿传过来的时间跟现在的时间做一个比较,如果时间间隔较大,可以直接拒绝这个请求,这个时间间隔就是由后台控制了,可以在一定程度上过滤掉一些无效的请求。

  • 拼接scheme,这是第三方的SDK自己调起自己家的APP,所以他们自己的scheme他们自己知道,不用管。拼接出来的可能是tencent://auth/login/native?t=:t&r=:r&appkey=:appkey&sec=:sec...,当然了,这样的拼接,在第三方自己的APP、平台肯定是能够识别出他们自己规定的这些格式的。

  • 通过UIApplication调起这个URL,唤起第三方的APP,并做一些操作。

  1. 第三方的APP在调起后,在url的中或者系统的粘贴板中拿到一些参数之后,首先判断一下传递过来的参数是否有效,有没有漏掉参数等等

  2. 第三方的APP需要把其中的一些参数发送到自己的后台去做一个验证,比如是trappkeysec等等吧

  3. 后台在收到这些参数以后,用appkey在后台数据库中查到对应的appSecret,然后做前端同样的加密算法得到一个新的sec1,然后将secsec1做一个比较,如果相同,则是合法的,否则就是不合法,然后返回一些安全信息

  4. 前端收到返回的验证信息后,根据信息中的结果来做一些操作,如果是OK的话,就继续完成用户请求操作的一些事,如果NO的话,就回绝用户的操作请求。

  5. 在第三方的APP内完成用户请求的操作后,可以通过拼接scheme来回调开发者自己的APP,拼接的方式是第三方自己的标识加上传递过来的appkey,这就是第一条中说道的添加URL Types字符串的拼接方式一样,这样就能够通过scheme进行一个回调了。数据的传输的话,跟第四条中的数据传输方式一样,就看第三方的SDK怎么处理了。

  6. 第三方回调开发者的APP后,会通过一个handleURL的方法进行操作验证等,如下:

    BOOL isWeixinSuc = [WXApi handleOpenURL:url delegate:self];
    BOOL isWeiboSuc = [WeiboSDK handleOpenURL:url delegate:self];
    BOOL isTencentSuc = [TencentOAuth HandleOpenURL:url];
    

    这应该是在做第三方接入的时候都会做的事吧。

  7. 通过上述的方法,第三方的SDK拿到当前的URL信息,用以处理是否是自己平台回调过来的,然后做相应的处理,并把数据或者操作结果通过delegate、通知等等方法告知开发者。

附录

当然了,上述的只是一个简化的流程,不同的第三方厂家,可能会有不同的一些做法,所以,这个仅作参考。

有兴趣的可以看看github上的这个OpenShare

关于scheme,由于这不是苹果检查APP包时的一个指数,所以,在设计自己公司scheme的时候,尽量做到不要跟别家的有重名,否则,当别的地方有人调起APP的时候,iOS系统还真不好说会调起谁家的APP了。

对于信息加密验证的话,可以使用HMAC系列散列算法,可以参考RFC2104

这里还有一个免费的在线工具供你测试

作为码农,关注的当然是code,点击传送CryptoJS

发表评论

电子邮件地址不会被公开。