OAuth2
概述
OAuth(开放授权)是一个开放标准,允许用户授权第三方移动应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容,OAuth2.0是OAuth协议的延续版本,但不向后兼容OAuth 1.0即完全废止了OAuth1.0。
它是基于令牌token的授权,在无需暴露用户密码的情况下,使应用能够获取对用户数据的有限访问。
相关术语
流程
- 第三方客户应用向资源持有者请求获取资源
- 资源持有者授权给第三方应用一个许可
- 第三方应用将该许可给予认证服务器(授权)进行认证,如果认证成功,返回一个
Access Token
访问令牌 - 第三方应用使用该access token到资源服务器处获取该access token对应的资源(也就是第一步中资源持有者自身的资源)
OAuth令牌类型
微信登录
准备工作
- 注册
- 完善开发者资料
- 开发者认证资质
- 创建网站应用
微信登录流程
请求code二维码
第一步:请求code二维码
1、 在基础地址上拼接参数
注:传入的 redirectUrl要先进行utf-8编码
2、拼接好参数后,重定向到该低智商
return “redirect:”+url;
// 生成微信登录扫描的二维码
// 只需要根据你的注册信息拼接一个url
// 其中redirectUrl在拼接之前用utf-8进行编码
@GetMapping("/createCode")
public String getWxCode() {
// 基础地址后面拼接参数
// 微信开放平台授权baseUrl %s相当于?代表占位符
String baseUrl = "https://open.weixin.qq.com/connect/qrconnect" +
"?appid=%s" +
"&redirect_uri=%s" +
"&response_type=code" +
"&scope=snsapi_login" +
"&state=%s" +
"#wechat_redirect";
// String.format设置%s中的值
// 请使用urlEncode对链接进行处理
String redirectUrl= ConstantProperties.WX_OPEN_REDIRECT_URL;
String encode = null;
// 传入的 redirectUrl要先进行utf-8编码
try {
encode = URLEncoder.encode(redirectUrl, "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
String url = String.format(
baseUrl,
ConstantProperties.WX_OPEN_APP_ID,
encode,
"auguigu"
);
// 请求微信的地址,重定向到请求的微信地址中,
return "redirect:"+url;
// RestController 用redirect没有重定向的原因
// RestController 用来做数据返回 ,我们现在不需要返回数据
}
获取accessToken
第二步:通过code去获取accessToken
在开发者中配置后 * 微信扫码登录之后会自动跳转到8150端口
http://localhost:8150/api/ucenter/wx/callback?code=081b6ZAc02Vubz1G2zCc0XI5Bc0b6ZAZ&state=auguigu
我们需要处理这个地址,回调即回调接口地址和域名跳转地址一样即可进行回调。 通过获取code和state
拼接获取accestoken地址
在callback中请求这个拼接好的地址,得到地址返回的token
- 利用HTTP工具类
HttpClientUtils
发送请求 - 请求得到的结果
result
为Json数据,需将json
转换成Hashmap
<k,v>键值对的形式
这里用到com.google.gson.Gson
类用于解析Json格式 - 取出结果集
result
中的access_token
和openid
/*
* 微信扫码登录之后会自动跳转到8150端口
* http://localhost:8150/api/ucenter/wx/callback?code=081b6ZAc02Vubz1G2zCc0XI5Bc0b6ZAZ&state=auguigu
* 我们需要处理这个地址
* 在这个域名地址下写程序 直接请求这个地址,
* 把本地服务端口改成8150
* 回调接口地址和域名跳转地址写成一样
*
* 在callback中获取扫码人信息
* */
@GetMapping("/callback")
public String callback(@RequestParam("code") String code,@RequestParam("state"