前后端分离版实现第三方登录:GITEE为例
1:首先maven安装依赖:
<!-- oauth工具类 -->
<dependency>
<groupId>com.xkcoding.justauth</groupId>
<artifactId>justauth-spring-boot-starter</artifactId>
<version>${justauth-spring-boot.version}</version>
</dependency>
2:在application.yml中配置:
3:前端点击图标:
giteeLogin() {
this.axios.get("/api/oauth/login/GITEE").then( ({ data }) => {
window.location = data.data;
})
}
4:这里的/api/oauth/login/GITEE
接口作用就是给前端返回一个完整的字符串,两部分组成:授权界面+回调地址:
/**
* 返回给前端回调地址
*
* @param response response
* @throws IOException
*/
@GetMapping("/login/{type}")
public R login(@PathVariable String type, HttpServletResponse response) throws IOException {
AuthRequest authRequest = factory.get(type);
String authorizeUrl = authRequest.authorize(AuthStateUtils.createState());
return R.ok("请求成功",authorizeUrl);
}
5:在第四步前端 window.location = data.data;
这个方法会使得界面跳转到授权页面,然后我们点击确认授权的一瞬间会来到后端的回调方法:
6:后端的回调方法:
/**
* 登录成功后的回调
*
* @return 登录成功后的信息
*/
@SaIgnore
@RequestMapping("/{type}/callback")
public void login(@PathVariable String type, AuthCallback callback , HttpServletRequest request, HttpServletResponse httpServletResponse) throws IOException {
AuthRequest authRequest = factory.get(type);
AuthResponse authResponse = authRequest.login(callback);
String s = JSONUtil.toJsonStr(authResponse.getData());
SysUser sysUser = JSON.parseObject(s,SysUser.class);
BlogLoginUser blogLoginUser = registerService.OauthRegister(sysUser);
httpServletResponse.sendRedirect("http://localhost:8081/oauth/login/gitee?userid="+blogLoginUser.getId());
}
7:然后我们注意到最后是httpServletResponse.sendRedirect
,这里的作用就是,前端首先是需要一个中转界面,也就是这里后端重定向的界面,我们的逻辑就是,后端回调方法会将这个gitee的用户信息拿到,然后走我们自己业务的方法,比如新用户就注册,不是新用户就直接查询出来,这里根据自己的实际情况给前端传值,一般是传token,我这里是传了用户id:
8:中转界面:使用this.$route.query.userid;
接收到后端重定向传来的id,(也可以是token,逻辑一样),然后在用一个axios请求根据id查询用户然后直接跳转到对应的成功界面,并且将数据存储到全局变量$store
,
<template>
<div v-loading="loading" style="height: 100%;width: 100%;">
</div>
</template>
<script>
export default {
name: "loginByGitee",
data() {
return {
loading: true,
}
},
mounted() {
//获取用户id
this.userid = this.$route.query.userid;
let param = new URLSearchParams();
param.append("userid", this.userid);
this.axios.post("/api/oauth/login/",param).then(({data}) =>{
if (data.code == 200) {
this.username = "";
this.password = "";
this.$store.commit("login", data.data);
this.$store.commit("closeModel");
this.$router.push("/")
this.$toast({ type: "success", message: "登录成功" });
} else {
this.$toast({ type: "error", message: data.msg });
}
})
}
}
</script>
<style scoped>
</style>