写在前面
为了能够更好以场景化的方式来理解OAuth2.0,本文一起看下,假定我们现在要开发一个交友类软件,为了提高用户登录的便利程度,需要对接微信开放平台,获取到用户的微信账号信息,作为用户的注册信息来使用,此时结构如下图:
交友软件应用最终要做的就是如图粉红色背景所示的内容,即通过令牌获取,微信账号信息
,那么为了做到这点,交友软件应用的开发人员需要做哪些事情呢?
1:注册成为开发者
在能够调用授权服务的接口之前,我们一定要先让自己有一个合法的身份,因此第一步就需要在微信开放平台,注册成为开发者,可能如下图:
其实这个过程就是在某个平台上注册一个账号,只不过这里我们是用于后续的开发使用,所以叫做开发者账号。
2:创建应用
注册成为开发者之后,就需要创建一个应用来代表交友软件
了,在这个过程中我们会拿到app_id,app_secret,等信息用于后续的申请令牌access_token的流程。
到这一步,编码前的准备工作就都完成了,一般需要等待审核,审核完毕之后,就可以正式进入编码流程了。
后续的流程可以参考演示视频:
OAuth2.0整个流程代码实现,并运行,进行代码演示
3:引导用户授权
此时为了让用户授权,我们需要开发一个页面来提示用户授权,比如:
4:在授权服务器的授权操作
这个不需要开发,因为是授权服务的内容,但为了流程的完整性,也放在这里,你在实际开发中知道就行。
接着会跳转到授权服务的授权页面,提醒用户进行真正的授权:
5:开发回调接口接收授权code,并换取令牌
这个需要交友软件的后台开发同学开发一个回调接口,来接收授权服务平台回调的授权码,然后换取令牌,代码可能如下:
@RequestMapping("/receiveAuthCode")
@ResponseBody
public String receiveAuthCode(HttpServletRequest request) {//授权码许可流程,DEMO CODEString code = request.getParameter("code");Map<String, String> params = new HashMap<String, String>();params.put("code", code);params.put("grant_type", "authorization_code");params.put("app_id", "APPID_RABBIT");params.put("app_secret", "APPSECRET_RABBIT");System.out.println("start post code for token ...");String accessToken = HttpURLClient.doPost(oauthURl, HttpURLClient.mapToStr(params));System.out.println("accessToken:" + accessToken);return "成功拿到了access_token: " + accessToken + ", 接着就可以拿来访问受保护资源了!";
}
6:使用令牌获取受保护资源
推荐使用post表单方式,当然也可以使用header方式,如下:
GET /resource HTTP/1.1
Host: server.example.com
Authorization: Bearer b1a64d5c-5e0c-4a70-9711-7af6568a61fb
uri方式也是一种选择,如:
GET /resource?access_token=b1a64d5c-5e0c-4a70-9711-7af6568a61fb HTTP/1.1
Host: server.example.com
但因为安全性低,所以一般不采用。
7:令牌刷新
令牌刷可以考虑定时刷新和用时发现过期刷新两种。前者有额外的开发工作量,后者则没有额外的工作量。具体可以根据实际情况来作出选择。但一般更推荐定时刷新。