三方登录的方式想必大家都很熟悉,基本健全的网页都会整几个入口,比如日常的微信、QQ,金融的支付宝,音视频的抖音、快手,码农领域的Github、Gitee等。

作为功能测试,我们就随机取一个简单的三方授权Gitee来尝试下。由于最近ChhatGPT写代码也是很火,这次的测试主要是chatGPT主导,本人负责辅助实现和测试,不经感叹效率高、能力强!

  • 一、三方登录常规的原理和流程
  • 二、关于JustAuth
  • 三、搭建全流程
    • 3.1 前期准备:内网穿透
    • 3.2 前期准备:申请一个三方登录授权应用
    • 3.3 开发指南:引入组件
    • 3.4 开发指南:构建一个基本的授权登录框架
    • 3.5 JustAuth+Gitee的三方登录

一、三方登录常规的原理和流程

  1. 用户点击第三方登录按钮,跳转到第三方平台的授权页面。

  2. 用户在第三方平台的授权页面上登录,确认授权。跳转到本地的服务,组装参数配置(response_type/client_id/redirect_uri/state,不同三方参数名可能不同,性质类似),请求三方平台。

  3. 第三方平台验证用户身份,生成授权码或访问令牌(state-对应提交过去的唯一值,code/auth_code,不同三方参数名可能不同,性质类似)。

  4. 用户的浏览器重定向回原网站(根据提交的redirect_uri进行回调),并将授权码或访问令牌传递给原网站。

  5. 原网站使用授权码或访问令牌向第三方平台请求用户信息(用户ID、头像、昵称等)。

  6. 第三方平台返回用户信息给原网站。

  7. 原网站使用用户信息创建或更新本地用户账号,完成用户登录。

了解了基本思路之后,java开发的角度,肯定上来先找轮子(如果有要求要自己实现的话,也可以参考轮子的代码)

这边简单测试,选用了Spring Boot+ JustAuth + Thymeleaf (+ Spring Security 完全没有登录逻辑,可以不加) + IDEA + 内网穿透

以上组件,基本都比较熟悉,简单聊一下 JustAuth

二、关于JustAuth

JustAuth 是一个开源的 Java 三方登录集成工具,它可以帮助开发者快速集成第三方登录功能。

目前支持超过 20 种第三方平台的登录认证,包括但不限于:GitHub、Gitee、微信、QQ、微博、Google、Facebook、Twitter、LinkedIn 等。

使用 JustAuth 可以避免开发者需要针对每个第三方平台编写繁琐的登录认证代码,从而提高开发效率。

从2018年11月开始,一经发布就受到大量的支持,截止目前经过一个个开源人的伟大奉献,到2023年3月10日,JustAuth项目在Github已经有14.5K的star数,足以窥见它的成绩。

下面就借这轮子,一起学习了解下本地测试三方登录的实操流程。前后流程会比较长,请耐心看完。

三、搭建全流程

3.1 前期准备:内网穿透

关于本地开发工具IDEA这就不用多说了,关于使用其他开发工具都是可以的。

由于我们要本地对接公网做联调测试,所以需要内网穿透或者其他自己配置代理的方式都行。

我这边是之前使用购买的花生壳一个6块的域名,并且有送2个内网穿透的配置体验机会,所以就选择这个,这个产品做的也是比较好用。但是HTTP【为响应《网络安全法》,将于2022年6月9日开始,为您提供更安全的外网访问服务,暂停使用HTTP映射】。但是依旧可以配置HTTPS的访问方式,映射本地HTTP的端口都是可以的。

具体配置方式参考:https://service.oray.com/question/8156.html
我参照以上指南,是可以配置好一个公网可访问,代理本地127.0.0.1:8080的接口。

已经具备了以上条件后,继续往下走。

3.2 前期准备:申请一个三方登录授权应用

需要在你需要三方登录对应的平台上去申请三方登录的权限,这边拿Gitee举例。

Gitee官方OAuth的文档:https://gitee.com/api/v5/oauth_doc#/
其中包含:应用名称(随意)、应用描述(随意)、应用主页(随意)、应用回调地址(这是主要的,你自己服务可以回调的地址)、权限(按需选择)
填写好之后直接提交配置,就可以获取接口所需的client-id和client-secret。

  1. 在 修改资料 -> 第三方应用,创建要接入码云的应用。
  2. 填写应用相关信息,勾选应用所需要的权限。其中: 回调地址是用户授权后,码云回调到应用,并且回传授权码的地址。正常三方登录,勾选用户权限+个人邮箱信息基本就够了。
  3. 创建成功后,会生成 Cliend ID 和 Client Secret。他们将会在上述OAuth2 认证基本流程用到。

3.3 开发指南:引入组件

确定具备一个基本的java\maven的项目,在pom.xml中引入

  • Spring Boot
  • JustAuth
  • Thymeleaf
  • Spring Security 不需要其他认证,可以不加

这边为了测试偷懒,引入了【justauth-spring-boot-starter】,以下是测试的POM

<dependencies><dependency><groupId>com.xkcoding.justauth</groupId><artifactId>justauth-spring-boot-starter</artifactId><version>1.4.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><!-- 排除 Spring Boot 默认的日志依赖 --><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId></dependency><!-- Thymeleaf 模板引擎 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><!-- Spring Security 安全框架 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency></dependencies>

3.4 开发指南:构建一个基本的授权登录框架

以下含非必须环节,不需要可自动过滤。

SpringSecurity身份验证,内置一个账号密码:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/home").authenticated().antMatchers("/oauth/**").permitAll().anyRequest().permitAll().and().formLogin().loginPage("/login").defaultSuccessUrl("/home").failureUrl("/login?error=true").and().logout().logoutSuccessUrl("/login");}@Autowiredpublic void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {auth.inMemoryAuthentication().withUser("user").password("{noop}password").roles("USER").and().withUser("admin").password("{noop}123456").roles("ADMIN");}
}

简单配备一个日志输出:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN"><Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/></Console></Appenders><Loggers><Root level="info"><AppenderRef ref="Console"/></Root></Loggers>
</Configuration>

简单配备一个登录页:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>Login</title>
</head>
<body>
<h1>Login</h1>
<div th:if="${param.error}"><p>Invalid username and password.</p>
</div>
<div th:if="${param.logout}"><p>You have been logged out.</p>
</div>
<form th:action="@{/login}" method="post"><div><label for="username">Username:</label><input type="text" id="username" name="username"/></div><div><label for="password">Password:</label><input type="password" id="password" name="password"/></div><div><button type="submit">Login</button></div>
</form>
<div><a th:href="@{/oauth/login/gitee}"><img src="https://huashuimoyu.com/image/thirdlogo/gitee.png" width="40px" height="40px"/></a>
</div>
</body>
</html>

简单配备一个登录跳转逻辑:

@Controller
public class HomeController {@GetMapping("/")public String home() {return "home";}@GetMapping("/home")public String home2() {return "home";}@GetMapping("/login")public String login() {return "login";}@PostMapping("/login")public String loginWithUsenamePassword(String username,String password){System.out.println(username);System.out.println(password);return "success";}
}

到这边,使用Springboot+SpringSecurity 依靠登录框进行账号密码登录的基本流程可以通了,此外依赖花生壳一个映射的配置,使用公网一个https的访问路径就可以访问到这个登录页了。

3.5 JustAuth+Gitee的三方登录

下面接入JustAuth补充Gitee的三方登录
前面依赖已经引入了,使用自动装配,只要在application的配置文件配置下、书写确定的跳转和回调接口即可

justauth:enabled: truetype:QQ:GITEE:client-id: 56ba1xxxxxx3c7dclient-secret: 90c7xxxxxx129a97redirect-uri: https://exxxxxxxxn/oauth/gitee/callback #就你本地自己提供出去的登录跳转的API,注意是公网可访问的

使用JustAuth简单实现一个调用和回调:

刚才在登录页就简单用一张图片链接触发一个三方登录请求。

<div><a th:href="@{/oauth/login/gitee}"><img src="https://huashuimoyu.com/image/thirdlogo/gitee.png" width="40px" height="40px"/></a>
</div>

点击图片后,跳转到后端接口,后端接口组装认证参数,提交到Gitee接口。

    @GetMapping("/login/{type}")public void login(@PathVariable String type, HttpServletResponse response) throws IOException {AuthRequest authRequest = factory.get(type);response.sendRedirect(authRequest.authorize(AuthStateUtils.createState()));}

请求Gitee,跳转到Gitee的授权登录页,选择想要授予的权限,点击确定。

确定后,Gitee就会将网址跳转到我们提交的redirect_url上,我们做出正确响应即可。

    @RequestMapping("/{type}/callback")public AuthResponse login(@PathVariable String type, AuthCallback callback) {AuthRequest authRequest = factory.get(type);AuthResponse response = authRequest.login(callback);System.out.println("【response】= {}"+JSON.toJSONString(response));return response;}

接口获取授权信息:

这个时候,我们的页面可以回到一个授权成功,正在登录页。我们可以在这个时候拿到Gitee用户的一些昵称、头像、uid这些信息,记录在自己网站中,后期可以直接认证。

干货|JustAuth三方账号授权登录免费搭建全流程相关推荐

  1. 三方账号授权登录系统设计思路

    文章目录 背景 关键概念 系统设计思路 总结 背景 借技术总结时间梳理一下三方登录授权的一些技术细节实现,假设saas 店铺和商品管理插件中心是两个独立的账号体系(内部分别对应 shopId 和 se ...

  2. (二十二)admin-boot项目之集成just-auth实现第三方授权登录

    (二十二)集成just-auth实现第三方授权登录 项目地址:https://gitee.com/springzb/admin-boot 如果觉得不错,给个 star 简介: 这是一个基础的企业级基础 ...

  3. Spring security 集成 JustAuth 实现第三方授权登录

    Spring security 集成 JustAuth 实现第三方授权登录脚手架: 一.特性 spring security 集成 JustAuth 实现第三方授权登录 : 此项目从 用户管理脚手架( ...

  4. Springboot基于justAuth实现第三方授权登录

    1. 简介 随着科技时代日渐繁荣,越来越多的应用融入我们的生活.不同的应用系统不同的用户密码,造成了极差的用户体验.要是能使用常见的应用账号实现全应用的认证登录,将会更加促进应用产品的推广,为生活增加 ...

  5. 苹果apple账号授权登录第三方APP

    Apple官方文档 前言:由于公司最近有个业务需求是要进行Apple账号授权登录,于是我看边看文档边借鉴其他人的写法,发现好多文章都有一个共性,一个是在解析JWT的时候自己设置参数后进行判断,这样做没 ...

  6. iOS小课堂: 集成 《阿里百川》教程( 打开商品详情页、 淘宝账号授权登录、 完成交易闭环)

    文章目录 前言 I 打开商品详情页面 II 淘宝账号授权登录 2.2 集成文档 2.3 Cocoapod方式引入百川SDK 上 III 常见错误 3.2 读取身份图片AppKey失败, see als ...

  7. 嵌入式Linux系统环境搭建全流程-4412友善之臂开发板

    4412友善之臂开发板-Linux系统环境搭建全流程 ​ 没错,这篇确实值得一看!可能是由于我稍微会一点点哈,就有好多小伙伴就找我帮他们搭建环境,但Linux中的以及开发版连接,与烧写程序中的整个环境 ...

  8. 企业级superset阿里云ESC搭建全流程详解

    企业级superset阿里云ESC搭建全流程详解 你好! 作为一名大数据猿来说.你可能会需要轻量级大数据bi工具superset来帮助你快速实现数据的可视化展示.那么我们以阿里云云服务器ESC举例,帮 ...

  9. web网页第三方账号授权登录

    ❤️最细微信小程序版本上传.提交审核.发布[建议收藏]❤️ ❤️2021直击大厂前端开发岗位面试题❤️ ❤️效果图如下,如有需要请自取修改[建议收藏]!❤️ ❤️微信小程序的灰度发布❤️ web网页端 ...

最新文章

  1. Docker registry V2
  2. [HDU] Tr A
  3. where does watchers in scope come from
  4. matlab提示未定义wc,WooCommerce 教程:修复致命错误调用未定义的函数wc_get_order() - WooCommerce 微站...
  5. 搜索算法(三)--DFS/BFS求解宝岛探险问题(JAVA )
  6. 高颜值可定制在线绘图工具
  7. 剑指offer之表示数值的字符串
  8. Android8.0 开机启动脚本,Android开机启动shell脚本(Android 8.0测试OK)
  9. 为VSCode 设置好看的字体:Operator Mono
  10. Unity战棋游戏资源
  11. BT656协议讲解与解码
  12. 2018湘潭大学程序设计竞赛【E】
  13. SpringBoot整合Memcached
  14. 内网网段范围_局域网网段到底是什么意思?怎么划分的啊?为什么要划分网段?...
  15. element ui图标使用方法
  16. Altium Designer 18中的Data Management–Device Sheets
  17. 哈拉德·柯施纳的狡猾
  18. 手机计算机的隐藏小技巧,华为手机隐藏的5个技巧,每一个值得收藏
  19. 电子信息专业见习报告
  20. 航模遥控继电器单通道控制2路继电器开关实现原理解析

热门文章

  1. 服务器黑屏只显示鼠标是什么意思,电脑黑屏只显示鼠标怎么办
  2. 企业微信如何建立部门?
  3. 宜家IKEA EDIFACT PRODAT报文详解
  4. mysql可重复读概念_Mysql可重复读原理
  5. 感性VS理性-处世之道
  6. VC MFC按钮(CButton)控件
  7. Win11耗电严重怎么解决 Win11耗电太快教程
  8. Android App 耗电的测试方法
  9. 区块链具有的8种特性
  10. 计算机老师的英语怎么写,英语感谢信感谢我的计算机老师