highlight: a11y-dark
theme: qklhk-chocolate
码云实现授权认证
1. 准备环境
springboot
基础服务IDEA
编译器- 浏览器
2. 授权登录
2.1 原理
第三方授权登录,实际上采用的是OAuth2
认证技术,中的授权码的方式进权限认证
授权码方式 : 指的是第三方应用先申请一个授权码,然后用授权码获取第三方服务的令牌
2.2 流程
3. 环境准备
3.1 创建第三方应用
- 登录码云,进入首页后.点击右上角图像进入设置
- 找到安全管理 分组中的 第三方应用
- 没有创建的情况下,我的应用是空的.点击右测的创建应用,进去表单页面
主页和回调我这边是这样写的
- 保存之后,会生成一个
Client_id
和Client_secret
这个将会在服务调用中用到
准备环境完成之后,就开始写代码了 .前提是你需要先创建好一个可以基础springboot
服务,没有的话可以点击下载 . 这是基于springboot
自己封装的一个开箱即用的基础服务.
4. 代码开发
4.1 创建一个常量类,用于存放需要用到的一些魔法值
这里有可以将这些基础常量放在application.yml
中,然后去读取 ```java /* * @ClassName MayunOauth * @Description TODO * @Author xiongchao * @Date 2021/4/9 10:49 */ public class MayunOauth {
/**
* 第三方权限认证的步骤
* 1. 通过client_id 和回调方法获取指定的第三方授权页面
* 2. 第三方页面授权成功,通过回调方法 获取返回的通行code
* 3. 通过 code和回调等 从第三方服务换取登录成功票据 token
* 4. 通过第三方服务的票据 token 获取用户的基本信息返回到前端页面
*/
// 码云我的应用中对应的 客户端id
public static final String clientId = "";
// 码云我的应用中对应的
public static final String secret = "";
// 配置的回调接口地址
public static final String callback ="http://localhost:8001/user/login/callback";
// 跳转码云的授权页面
public static final String mayunURI = "https://gitee.com/oauth/authorize?client_id=" + clientId + "&redirect_uri="+ callback+"&response_type=code";
// 通过码云的code换取他的token凭据
public static final String postToken = "https://gitee.com/oauth/token";
// 通过码云服务的token凭据 获取用户信息
public static final String userInfo = "https://gitee.com/api/v5/user";
}
```
存放第三方token返回的数据的对象,不是必须要的 ```java @Data public class Oauth {
private String accessToken;
private String tokenType;
private Long expiresIn;
private String refreshToken;
private String scope;
private String createdAt;
} ```
4.2 第三方授权页面跳转接口
在对应的前端页面,添加一个码云的图片,点击图片跳转到码云的授权登录页面,接口如下所示 java @ApiOperation(value = "跳转码云第三方登录") @GetMapping("/login/oauth") public void login(HttpServletRequest request, HttpServletResponse response) { log.info("跳转第三方登陆认证"); try { response.sendRedirect(MayunOauth.mayunURI); } catch (IOException e) { e.printStackTrace(); log.error(e.getMessage()); } }
4.2 点击授权之后,会触发配置的回调接口,然后在接口中可以进行一些其它操作
-
- 通过client_id 和回调方法获取指定的第三方授权页面
-
- 第三方页面授权成功,通过回调方法 获取返回的通行code
-
- 通过 code和回调等 从第三方服务换取登录成功票据 token
-
- 通过第三方服务的票据 token 获取用户的基本信息返回到前端页面
回调接口如下所示
```java @GetMapping("/login/callback") public Result login(@RequestParam(value = "code") String code ) { log.info("认证成功返回的code为:{}" ,code); //通过返回的code去回去码云的 token信息 String token = userService.getToken(code); JSONObject parse = (JSONObject) JSONObject.parse(token); //通过预先创建的对象接收,如果觉得麻烦可以直接转成map然后再取出token Oauth oauth = JSONObject.toJavaObject(parse,Oauth.class); // 通过token 获取用户信息 Map
res = userService.getUserInfo(oauth.getAccessToken());
return Result.success(res);
}
```
服务层 ```java
String getToken(String code);
Map<String,Object> getUserInfo(String accessToken);
```
接口实现类 ```java @Override public String getToken(String code) { //这个几个参数格式是强制性的 可以参考码云的官方api Map params = new HashMap<>(); params.put("grant type","authorizationcode"); params.put("code",code); params.put("client id",MayunOauth.clientId); params.put("redirecturi",MayunOauth.callback); params.put("client_secret",MayunOauth.secret); String post = HttpUtil.post(MayunOauth.postToken, params);
return post;
}
@Override
public Map<String, Object> getUserInfo(String accessToken) {
Map<String,Object> params = new HashMap<>();
params.put("access_token",accessToken);
String userInfo = HttpUtil.get(MayunOauth.userInfo, params);
Map<String, Object> res = (Map<String, Object>) JSONObject.parse(userInfo);
return res;
}
```
4.3 相关类的maven坐标地址
http
远程调用服务才有的是hutool
xml <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.4.1</version> </dependency>
JOSNObject
是com.alibaba.fastjson
xml <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.28</version> </dependency>