为接入oauth2.0,第三方软件需要做哪些工作

如果要基于开放平台构建一个第三方软件的应用,第三方软件的研发人员应该做哪些工作?

要到开放平台申请注册为开发者,在成为开发者以后再创建一个应用,之后就开始开发了

开发第三方软件应用的过程中,第三方软件的研发人员需要重点关注哪些内容呢?

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开发总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值