springboot 整合 justauth 实现第三方登录 | gitee登录 | 乐文库-凯发k8官网下载客户端
我第一次想去实现gitee、github登录的时候,完全就是各种搜索,看到一个知识点去了解一个知识点,当时 justauth 其实已经存在了,但是远没有现在这么容易搜索到。
一、第三方登录
在实现第三方登录前,咱们先聊聊第三方登录背后大致的实现逻辑吧,代码实现其实很简单,思想在这种时候,可能比代码更为重要一些。
现在只要稍微大点的网站或是app都会支持第三方登录吧,面对我们开发者居多的 gitee、github、google等,面对普通用户较多的qq、微信等第三方登录。
第三方登录大都是基于oauth2.0协议实现的,oauth是一项协议,它为用户资源的授权提供了一个安全、开放而简易的标准,oauth的授权不会使第三方触及到用户的账号信息(比如密码)。
市面上也有很多例子,像我们平常肯定也是使用过第三方登录的。
假如你注册一个平台,在你选择使用第三方登录时,一般都会跳转到你选择的登录平台的登录页面去,在那里进行密码的输入,以及用户信息的验证。你注册的那个平台,不会接触到你的密码账号信息等信息,一般都是授权一些昵称、头像等基本信息的使用,一定程度上保护了你本人的一些信息在网络上的扩散和泄露。
二、项目中接入gitee登录
如果是自己从0到1实现第三方其实也是可以的,只不过要不过自己封装一些请求罢了。市面有并且不止一种方面帮我们造出了轮子,适当的学会偷懒还是可以的~
这个适当的偷懒,并非说让大家依赖在使用这一层,在能够使用之后,你应该要有好奇和热爱探索的时候,你该去试着想一想还有没有更简便的方式,又或是你自己可以封装这样的一个工具吗?亦或是心中有那么一种想知道它是如何实现的想法。
我觉得这才是学习时候的成长,并且就算是在以后突然多了一些定制化的需求,你也有足够大的把握去实现它。
被动的推动,远不如自我的好奇来的实在和有趣~
2.1、准备环境
创建一个springboot项目,
导入jar~
拥有一个gitee账号~
2.1.1、gitee创建一个应用
在个人设置中,找到数据管理中的第三方应用。
然后点击创建应用:
创建成功后,拿到client id、client secret两个信息
2.1.2、准备项目
创建springboot项目、导入依赖
org.springframework.boot spring-boot-starter-parent 2.5.2 8 8 org.springframework.boot spring-boot-starter 2.5.2 org.springframework.boot spring-boot-starter-web 2.5.2 org.springframework.boot spring-boot-starter-test junit junit 4.12 com.alibaba fastjson 1.2.72 org.projectlombok lombok 1.18.20 cn.hutool hutool-all 5.1.4 com.xkcoding.justauth justauth-spring-boot-starter 1.4.0 复制代码
yml配置文件
server: port: 8089 spring: application: name: springboot-redis justauth: enabled: true type: gitee: client-id: 创建成功的应用的id client-secret: 创建成功的应用的密钥 redirect-uri: http://127.0.0.1:8089/oauth/gitee/callback #项目中的回调地址 cache: type: default复制代码
另外还有个主启动类,无需特殊注解,普通的springboot启动类即可。
2.2、controller类的编写
package com.nzc.controller; import cn.hutool.json.jsonutil; import com.xkcoding.justauth.authrequestfactory; import lombok.requiredargsconstructor; import lombok.extern.slf4j.slf4j; import me.zhyd.oauth.model.authcallback; import me.zhyd.oauth.model.authresponse; import me.zhyd.oauth.request.authrequest; import me.zhyd.oauth.utils.authstateutils; import org.springframework.beans.factory.annotation.autowired; import org.springframework.web.bind.annotation.getmapping; import org.springframework.web.bind.annotation.pathvariable; import org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.restcontroller; import javax.servlet.http.httpservletresponse; import java.io.ioexception; import java.util.list; @slf4j @restcontroller @requestmapping("/oauth") public class authcontroller { @autowired private authrequestfactory factory; @getmapping public list list() { return factory.oauthlist(); } @getmapping("/login/{type}") public void login(@pathvariable string type, httpservletresponse response) throws ioexception { authrequest authrequest = factory.get(type); response.sendredirect(authrequest.authorize(authstateutils.createstate())); } @getmapping("/{type}/callback") public authresponse login(@pathvariable string type, authcallback callback) { authrequest authrequest = factory.get(type); authresponse response = authrequest.login(callback); log.info("【response】= {}", jsonutil.tojsonstr(response)); return response; } }复制代码
咋说勒,到这一步,你就成功引入了gitee的第三方登录~
justauth 用两个字来形容就是简和全。
我先来说一说这个controller类的一些操作,
我们首先访问localhost:8089/login/{type}接口,这里的type是实现哪个第三方登录,这里就是填什么类型,像我们实现了 gitee,此处便填写gitee。
进入方法后,authrequestfactory通过 type,get出一个authrequest,这个authrequest是一个接口,里面是一早就封装了相关第三方登录的请求接口,我们是直接拿来用的。稍微看一下源码就知道了~
response.sendredirect(authrequest.authorize(authstateutils.createstate()));是重定向到第三方登录的接口,正确授权后,会跳转到我们先前在应用中写好的回调方法中 。
第二个接口/oauth/{type}/callback是就是正确授权后,请求的回调接口,即是当 gitee 授权通过后,将会调用的接口。
2.3、测试实现
如果是没登录的情况下,会跳转到登录页,如果是已登录的情况,就是一个授权的界面。
成功登录后就会调用我们写好的回调接口,返回登录用户的相关信息。
这一段json数据其实就含有我们想要的信息,也有着我之后想继续写文章的知识点。
{ "code": 2000, "msg": null, "data": { "username": "crushlxb", "nickname": "宁在春", "gender": "unknown", "source": "gitee", "token": { "accesstoken": "33087141a9f029f0ad647b720653104e", "expirein": 86400, "refreshtoken": "c5d35725a443d62deb106febb99f2e1c534cc394dfb39c00c7e9d1ccf3a35b4e", "refreshtokenexpirein": 0, }, "rawuserinfo": { "gists_url": "https://gitee.com/api/v5/users/crushlxb/gists{/gist_id}", "repos_url": "https://gitee.com/api/v5/users/crushlxb/repos", } } }复制代码
一些我个人信息的东西,我都去掉了,这里面我比较感兴趣的还是accesstoken和refreshtoken的实现,并不是说是多难,而是觉得这是值得写上一篇文章的知识点,至少它是比较实用的的~
大家感兴趣也可以去看一看~
后记
justauth 的 gitee地址justauth-spring-boot-starter在这里,如果对大家有帮助,希望大家能去点个star,我觉得每一个正向反馈,都是对于开源作者的鼓励,也是他们坚持下去的动力。
我觉得技术的发展从来都不是因为某个人而发展庞大的,而是我们这一整个群体。
我对技术充满浪漫主义的想法,也只有在文章中能写一写,所以偶尔我就喜欢上说上这样的一番废话,其实我每次在写到开源的项目或技术时,我都会提一嘴点star这样的事情,倒不是打广告,而是我感觉这其实和我写文章是一样的感受,希望能够接收到大家的正向反馈。
若是不喜,望各位见谅,并竟我的创作除了希望自己的文字能产生对他人的帮助外,就是希望能够满足自己的愉悦和诉说自己的言语。
本文来自网络,不代表乐文库立场,如若转载,请注明出处:https://www.lewenku.com/?p=462266