Vue+JustAuth+SpringBoot,前后端分离项目Vue集成第三方登录

前言

JustAuth,如你所见,它仅仅是一个第三方授权登录的工具类库,它可以让我们脱离繁琐的第三方登录 SDK,让登录变得So easy!

在这里插入图片描述

官网文档:官网地址

博主在学习时参考的文章,也分享给大家:
一杯茶的时间,上手第三方登录类库 JustAuth

SpringBoot+Vue如何集成第三方登录登录JustAuth

快速开始

前期准备

登录码云gitee,在设置中配置第三方应用获取密钥
在这里插入图片描述
注意回调地址的填写,必须对应咱们springboot项目中url路径
在这里插入图片描述
导入依赖

      <!--JustAuth-->
        <dependency>
            <groupId>me.zhyd.oauth</groupId>
            <artifactId>JustAuth</artifactId>
            <version>1.15.1</version>
        </dependency>
         <!-- hutool工具类-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.3.3</version>
        </dependency>

SpringBoot

废话不多说,直接上代码

/**
 * 第三方登录
 * @author Tu_Yooo
 * @Date 2021/6/27 19:00
 */
@RestController
@RequestMapping("/oauth")
public class JustAuthController {
    
    

    @Autowired
    private JwtUtils jwtUtils;

    /**
     * 获取授权链接并跳转到第三方授权页面
     *
     * @param response response
     * @throws IOException response可能存在的异常
     */
    @RequestMapping("/render/{source}")
    public Result renderAuth(HttpServletResponse response) throws IOException {
    
    
        AuthRequest authRequest = getAuthRequest();
        String token = AuthStateUtils.createState();
        //生成gitee的授权url
        String authorizeUrl = authRequest.authorize(token);
        //将这个url返回给前端Vue
        //由Vue去执行 授权页
        Map<String, String> map = new HashMap<>();
        map.put("url", authorizeUrl);
        System.out.println(authorizeUrl);
        return Result.success(map);
    }


    /**
     * 用户在确认第三方平台授权(登录)后, 第三方平台会重定向到该地址,并携带code、state等参数
     * @param callback 第三方回调时的入参
     * @return 第三方平台的用户信息
     */
    @RequestMapping("/callback/{source}")
    public void login(@PathVariable("source") String source, AuthCallback callback, HttpServletResponse response) throws IOException {
    
    
        AuthRequest authRequest = getAuthRequest();
        AuthResponse login = authRequest.login(callback);
        //此处可以获取到gitee给我传输过来的用户信息 可以打印看一下,可以根据自己系统的业务逻辑进行相应处理
        //由于我的是demo 所以不进行处理
        System.out.println(login);
        //前后端分离 都是通过jwt token来判断当前用户是否有权限访问
        //我这里生成的一个假的jwt 实际业务中 怎么生成jwt 你们自己定 我这里直接返回了
        //生成JWT
        String jwt = jwtUtils.generateToken("admin");
        System.out.println(jwt);
        //设置当请求头中
        response.setHeader(jwtUtils.getHeader(),jwt);
        //跳转到中转页面
        //这里的地址对应 vue项目中的 中转页面 
        //vue的中转页面 会将token从url中取出 记录到本地
        response.sendRedirect("http://localhost:8080/test?token="+jwt);
    }


    /**
     * 获取授权Request
     *
     * @return AuthRequest
     */
    private AuthRequest getAuthRequest() {
    
    
        return new AuthGiteeRequest(AuthConfig.builder()
        //gitee中的id
                .clientId("XXXXXXXXXXXXXXXXXXXXXXXXXXXx")
                //gitee中的密钥
                .clientSecret("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")
              //在gitee中申请的回调地址
                .redirectUri("http://localhost:8081/oauth/callback/gitee")
                .build());
    }
}

代码逻辑:
1.Vue项目中发起请求,请求后端SpringBoot生成一个gitee的授权页,并返回给Vue
2.Vue调用gitee的授权页,当用户点击确定时,调用SpringBoot中的回调地址
3.回调地址中可以根据自己项目逻辑取出用户信息,最后基于url返回认证token信息(咱们这里让它调用Vue中的中转页,以便于我们在中转页中取出token)
4.Vue跳转到中转页,我们取出token信息,基于VueX 封装到本地,然后跳转首页
5…此刻也就完成了第三方登录

Vue

Login登录页

登录页中准备一个点击事件

<el-button @click="giteelogin">gitee登录</el-button>

点击事件触发的方法

//请求后端SpringBoot授权页方法
      giteelogin(){
    
    
              
                this.$axios.get('/oauth/render/gitee').then(res => {
    
    
                  //获取到后端传递过来的授权路径
                    console.log('>>>>')
                    console.log(res.data.data.url)
                    //跳转到gitee授权页
                    window.location.href= res.data.data.url;
                })
            }

中转页

中转页是用户同意授权以后 通过回调地址访问到了后端代码

后端会在最后的时候将认证信息通过url返回到中转页

<template>
    <div><h1>登录中</h1></div>
</template>

<script>
    export default {
     
     
        name: "test",
        methods: {
     
     
        //解析url中的token参数
            getToken(){
     
     
                var url = window.document.location.href.toString();//获得当前url地址并转换成字符串
                console.log(url)
                var u = url.split("?");//以?来分割字符串,将?前后的值存到一个数组中
                if(typeof(u[1]) == "string"){
     
     //获得?后面具体的请求参数值
                    u = u[1].split("&");
                    var get = {
     
     };
                    for(var i in u){
     
     
                        var j = u[i].split("=");
                        get[j[0]] = j[1];
                    }
                    return get;
                }
            }
        },
        created() {
     
     
        //获取到token 并封装到store中用于全程携带
            let token11=this.getToken();
            console.log(token11.token)
            let token = token11.token
            if (token != undefined && token != {
     
     }){
     
     
                //vuex
                this.$store.commit('SET_TOKEN',token)
                //this.localStorage.setItem('token',token)
              //  var aaa = localStorage.getItem('token');
              //跳转到首页
                this.$router.push('/index')
            }
        }
    }
</script>

<style scoped>

</style>

Guess you like

Origin blog.csdn.net/weixin_46684099/article/details/118297276