一、简介
系统登录的方式有很多种,一种是通过用户名和密码进行登录,还有一种现在比较流行的就是集成第三方平台的登录功能,如下图:https://gitee.com/login
为了简化新用户的注册流程,现在很多平台也都提供了社交登录的方式,如CSDN、Gitee等等。本篇文章以微博为例简单总结一下大体的实现步骤。
二、新建应用
浏览器访问:https://open.weibo.com/,使用自己的微博账号登录。我们首先需要建议一个自己的用,其实就是申请App Key和App Secret。
【a】点击网站接入
【b】创建新应用
【c】查看App Key和App Secret
【d】OAuth2.0 授权设置
三、分析OAuth2.0简要流程
文档地址:
https://open.weibo.com/wiki/%E6%8E%88%E6%9D%83%E6%9C%BA%E5%88%B6%E8%AF%B4%E6%98%8E
目前微博开放平台用户身份鉴权主要采用的是OAuth2.0,所以我们首先先简单了解一下什么是OAuth2.0。
OAuth 不是一个API或者服务,而是一个验证授权(Authorization)的开放标准,所有人都有基于这个标准实现自己的OAuth。
更具体来说,OAuth是一个标准,app可以用来实现secure delegated access. OAuth基于HTTPS,以及APIs,Service应用使用access token来进行身份验证。
OAuth主要有OAuth 1.0a和OAuth 2.0两个版本,并且二者完全不同,且不兼容。OAuth2.0 是目前广泛使用的版本,我们多数谈论OAuth时,为OAuth2.0。
OAuth2.0较1.0相比,整个授权验证流程更简单更安全,也是未来最主要的用户身份验证和授权方式。
OAuth2.0简要流程图如下所示:
- 1、向用户申请认证授权;
- 2、用户授权,用户输入自己的社交登录账号密码;
- 3、使用上一步的授权,进行认证处理;
- 4、认证通过,返回访问令牌;
- 5、客户端拿着访问令牌去请求资源服务器保护起来的信息;
- 6、认证令牌,返回受保护信息给客户端;
四、Web网站的授权
了解了OAuth2.0的大体流程,下面我们以Web网站的授权为例,讲解对接微博社交登录的几个步骤:
【a】引导需要授权的用户到如下地址:
https://api.weibo.com/oauth2/authorize?client_id=YOUR_CLIENT_ID&response_type=code&redirect_uri=YOUR_REGISTERED_REDIRECT_URI
- YOUR_CLIENT_ID:就是我们前面申请的App Key;
- YOUR_REGISTERED_REDIRECT_URI:就是我们设置的授权回调地址;
我们直接使用浏览器请求:
https://api.weibo.com/oauth2/authorize?client_id=你的appKey&response_type=code&redirect_uri=指定的授权回调页面
如果用户同意授权,页面跳转至 YOUR_REGISTERED_REDIRECT_URI/?code=CODE,授权成功后,微博会回调之前指定的回调页面,并带上参数code
【b】换取Access Token
https://api.weibo.com/oauth2/access_token?client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&grant_type=authorization_code&redirect_uri=YOUR_REGISTERED_REDIRECT_URI&code=CODE
参数说明:
- YOUR_CLIENT_ID: 你的appKey;
- YOUR_CLIENT_SECRET:你的appSecret;
- YOUR_CLIENT_SECRET:你指定的回调页面地址;
这里我们使用postman模拟使用code换取access_token:
可以看到, "access_token": "2.00y5FtSDMYuAkBc548dddb43el12PC", 这就是我们可以拿着这个访问令牌去调用微博开放API的接口了,如获取用户信息、获取用户微博信息等等。
【c】 使用获得的Access Token调用API
这样就查询到微博服务器那边保存的当前用户的基本信息,后台我们就可以对这个用户进行注册等相关操作。
【d】后端大体代码如下:
/**
* 微博登录成功后的回调地址(带上code)
*/
@GetMapping("/oauth2.0/weibo/success")
public String weiboLogin(@RequestParam("code") String code) {
// 1、封装请求参数
Map<String, String> map = new HashMap<>();
map.put("client_id", "你的appKey");
map.put("client_secret", "你的appSecret");
map.put("grant_type", "authorization_code");
map.put("redirect_uri", "http://auth.imall.com/oauth2.0/weibo/success");
map.put("code", code);
// 2、根据Code获取AccessToken
HttpResponse response = HttpUtils.doPost("https://api.weibo.com", "/oauth2/access_token", "post", new HashMap<>(16), map, new HashMap<>(16));
// 3、处理
if (response.getStatusLine().getStatusCode() == 200) {
// 获取到了Token
String json = EntityUtils.toString(response.getEntity());
//拿到access_token之后,可以再次发起http请求去调用微博相关接口,获取到用户的一些信息,如昵称、性别、头像信息等等,然后注册到我们系统中.
//当然注册之前需要判断一下:微博的每个账号有个uid,能唯一标识这个用户,我们的用户表可以将uid保存起来,根据uid去判断这个用户是否已经在我们
// 系统注册过了,如果之前注册过就不需要重复注册,直接进行登录.
return null;
} else {
//跳转到登录页面
}
}
注意:这里的controller请求路径其实就是对应到我们刚刚在微博开放平台配置的授权回调页面地址。