如果要基于开放平台构建一个第三方软件的应用,第三方软件的研发人员应该做哪些工作?
要到开放平台申请注册为开发者,在成为开发者以后再创建一个应用,之后就开始开发了
开发第三方软件应用的过程中,第三方软件的研发人员需要重点关注哪些内容呢?
1. 注册信息
第三方软件软件需要先拥有自己的app_id和app_serect等信息,同时还要填写自己的回调地址redirect_uri、申请权限等信息。
2. 引导授权
比如,用户要使用第三方软件来请求受保护资源,那用户首先访问的一定是第三方软件(原则上是直接访问第三方软件,不过对于服务市场这种场景的时候,会有稍微不同)
String oauthUrl = "http://localhost:8081/OauthServlet-ch03?reqType=oauth";
response.sendRedirect(toOauthUrl);//授权码流程的【第一次】重定向
3. 获取授权码code
作为第三方开发者或者ISV(独立软件供应商)在接入这些开放平台的时候,最应该关心的就是开放平台的官方文档,关注接入的流程是怎样的、对应的API是什么、每个API都传递哪些参数。
4. 获取访问令牌
举一个例子来说明:在使用spring social开发qq联合登录的时候遇到一个问题:
no suitable HttpMessageConverter found for response type [interface java.util.Map] and content type [text/html]
原因是:注意其根据code换取access_token的时候,其响应的Content-Type是text/html,并不是我们想象的application/json,这个要仔细来阅读其开放平台的API加以确认。
5. 使用访问令牌
目前OAuth 2.0的令牌只支持一种类型,那就是bearer令牌,bearer令牌可以是任意字符串格式的令牌。
官方规范给出的使用访问令牌请求的方式,有三种,分别是:
-
Form-Encoded Body Parameter(表单参数)
POST /resource HTTP/1.1 Host: server.example.com Content-Type: application/x-www-form-urlencoded access_token=b1a64d5c-5e0c-4a70-9711-7af6568a61fb
-
URI Query Parameter(URI查询参数)
GET /resource?access_token=b1a64d5c-5e0c-4a70-9711-7af6568a61fb HTTP/1.1 Host: server.example.com
-
Authorization Request Header Field(授权请求头部字段)
GET /resource HTTP/1.1 Host: server.example.com Authorization: Bearer b1a64d5c-5e0c-4a70-9711-7af6568a61fb
采用哪种方式最合适呢?
根据 OAuth 2.0 的官方建议,系统在接入OAuth 2.0之前信息传递的请求载体是JSON格式的,那么如果继续采用表单参数提交的方式,令牌就无法加入进去了,因为格式不符。
- 如果采用参数传递的方式呢,整个URI会被整体复制,安全性是最差的。
- 而请求头部字段的方式就没有上述的这些“烦恼”,因此官方的建议是采用Authorization的方式来传递令牌。
但是,**建议采用表单提交,也就是POST的方式来提交令牌,**原因是这样的,从官方的建议中也可以看出,它指的是在接入OAuth 2.0之前,如果你已经采用了JSON数据格式请求体的情况下,不建议使用表单提交。但是,刚开始的时候,只要三方软件和平台之间约束好了,大家一致采用表单提交,就没有任何问题了。因为表单提交的方式在保证安全传输的同时,还不需要去额外处理Authorization头部信息
//使用 accessToken 请求受保护资源服务
Map<String, String> paramsMap = new HashMap<String, String>();
paramsMap.put("app_id","APPID_RABBIT");
paramsMap.put("app_secret","APPSECRET_RABBIT");
paramsMap.put("token",accessToken);
String result = HttpURLClient.doPost(protectedURl,HttpURLClient.mapToStr(paramsMap));
6. 使用刷新令牌
关于刷新令牌的使用,第三方软件的开发人员最需要关心的是,什么时候来使用刷新令牌。
定时检测方式
在第三方软件收到访问令牌的同时,也会收到访问令牌的过期时间expires_in。一个设计良好的第三方应用,应该将expires_in值保存下来并定时检测;如果发现expires_in即将过期,则需要利用refresh_token去重新请求授权服务,以便获取新的、有效的访问令牌。
现场发现方式
比如第三方软件访问受保护资源(用户店铺订单)的时候,突然收到一个访问令牌失效的响应,此时第三方软件立即使用refresh_token来请求一个访问令牌,以便继续代表用户(用户)使用他的数据。
综合来看的话,定时检测的方式,需要额外开发一个定时任务;而“现场”发现,就没有这种额外的工作量。具体采用哪一种方式,你可以结合自己的实际情况。不过呢,建议采用定时检测这种方式,因为它可以带来“提前量”,以便有更好的主动性,而现场发现就有点被动了。
说到这里,我要再次提醒你注意的是,刷新令牌是一次性的,使用之后就会失效,但是它的有效期会比访问令牌要长。这个时候我们可能会想到,如果刷新令牌也过期了怎么办?在这种情况下,我们就需要将刷新令牌和访问令牌都放弃,相当于回到了系统的初始状态,只能让用户用户重新授权了。
补充:服务市场中的第三方应用软件
在构建第三方应用的引导授权时,我们说用户第一次“触摸”到的一定是第三方软件,但这并不是绝对的。这个不绝对,就发生在服务市场这样的场景里。
那什么是服务市场呢?说白了,就是你开发的软件,比如第三方软件打单软件、店铺装修软件等,都发布到这样一个“市场”里面售卖。这样,当用户购买了这些软件之后,就可以在服务市场里面看到有个“立即使用”的按钮。点击这个按钮,用户就可以直接访问自己购买的第三方软件了。
比如,京东的京麦服务市场里有个“我的服务”目录,里面就存放了我购买的打单软件。用户就可以直接点击“立即使用”,继而进入第三方软件打单软件
那么,这里需要注意的是,作为第三方开发者来构建第三方软件的时候,在授权码环节除了要接收授权码code值之外,还要接收用户的订购相关信息,比如服务的版本号、服务代码标识等信息。
更多内容,参考:oauth2.0开发总结