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

2,061 阅读3分钟

码云实现授权认证

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中,然后去读取

/**
 * @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返回的数据的对象,不是必须要的

@Data
public class Oauth {

    private String accessToken;

    private String tokenType;

    private Long expiresIn;

    private String refreshToken;

    private String scope;

    private String createdAt;
}

4.2 第三方授权页面跳转接口

在对应的前端页面,添加一个码云的图片,点击图片跳转到码云的授权登录页面,接口如下所示

@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 获取用户的基本信息返回到前端页面

回调接口如下所示

 @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<String,Object> res  = userService.getUserInfo(oauth.getAccessToken());

        return Result.success(res);
    }

服务层


    String getToken(String code);

    Map<String,Object> getUserInfo(String accessToken);

接口实现类

    @Override
    public String getToken(String code) {
        //这个几个参数格式是强制性的 可以参考码云的官方api
        Map<String,Object> params = new HashMap<>();
        params.put("grant_type","authorization_code");
        params.put("code",code);
        params.put("client_id",MayunOauth.clientId);
        params.put("redirect_uri",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
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.4.1</version>
        </dependency>
  1. JOSNObjectcom.alibaba.fastjson
         <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.28</version>
        </dependency>

4.4 回调成功后即可返回用户信息(这里根据个人业务需求做出对应的操作)

image.png

image.png