Java实现码云第三方授权登录


highlight: a11y-dark

theme: qklhk-chocolate

码云实现授权认证

1. 准备环境

  • springboot 基础服务
  • IDEA 编译器
  • 浏览器

2. 授权登录

2.1 原理

第三方授权登录,实际上采用的是OAuth2认证技术,中的授权码的方式进权限认证

授权码方式 : 指的是第三方应用先申请一个授权码,然后用授权码获取第三方服务的令牌

2.2 流程

image.png

3. 环境准备

3.1 创建第三方应用

  1. 登录码云,进入首页后.点击右上角图像进入设置

image.png

  1. 找到安全管理 分组中的 第三方应用

image.png

  1. 没有创建的情况下,我的应用是空的.点击右测的创建应用,进去表单页面

image.png 主页和回调我这边是这样写的

image.png

  1. 保存之后,会生成一个Client_idClient_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()); } }

image.png

4.2 点击授权之后,会触发配置的回调接口,然后在接口中可以进行一些其它操作

    1. 通过client_id 和回调方法获取指定的第三方授权页面
    1. 第三方页面授权成功,通过回调方法 获取返回的通行code
    1. 通过 code和回调等 从第三方服务换取登录成功票据 token
    1. 通过第三方服务的票据 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坐标地址
  1. http远程调用服务才有的是hutool xml <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.4.1</version> </dependency>
  2. JOSNObjectcom.alibaba.fastjson xml <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.28</version> </dependency>
4.4 回调成功后即可返回用户信息(这里根据个人业务需求做出对应的操作)

image.png

image.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值