授权协议OAuth 2.0之如何接入授权服务

发布于:2024-04-17 ⋅ 阅读:(35) ⋅ 点赞:(0)

写在前面

为了能够更好以场景化的方式来理解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 CODE
    String 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:令牌刷新

令牌刷可以考虑定时刷新和用时发现过期刷新两种。前者有额外的开发工作量,后者则没有额外的工作量。具体可以根据实际情况来作出选择。但一般更推荐定时刷新。

写在后面

参考文章列表

多知道一点