spring security OAuth2 客户端接入gitee

news2024/11/24 5:34:49

一、简介

     OAuth 是一个开放标准,该标准允许用户让第三方应用访问该用户在某一网站上存储的私密资源(如头像、照片、视频等),并且在这个过租中无须将用户名和密码提供给第三方应用。通过令牌(token)可以实现这一功能,每一个令牌授权一个特定的网站在特定的时段内允许可特定的资源。0Auth让用户可以授权第三方网站灵活访问它们存储在另外一些资源服务器上的特定信息,而非所有内容。对于用户而言,我们在互联网应用中最常见的 OAuth应用就是各种第三方登录,例如QQ授权登录、微信授权登录、微博授权登录、GitHub 授权登录等。

例如用户想登录 Ruby China,传统方式是使用用户名密码但是这样并不安全,因为网站会存储你的用户名密码,这样可能会导致密码泄露。这种授权方式安全隐患很大,如果使用 0Auth 协议就能很好地解决这一问题。

   注意:OAuth2 是0Auth 协议的下一版本,但不兼容 Auth 1.0。 OAuth2 关注客户端开发者的简易性,同时为 web 应用、桌面应用、移动设备IoT 设备提供专门的认证流程。


二、OAuth2 四种授权模式

    0Auth2 协议一共支持四种不同的授权模式, 无论哪种授权模式,其授权流程都是相似的,只不过在个别步骤上有一些差异而已;

  1. 授权码模式:常见的第三方平台登录功能基本都是使用这种模式;
  2. 简化横式:简化模式是不需要第三方服务端参与,直接在浏览器中向授权服务器申请令牌 (token),如果网站是纯静态页面,则可以采用这种方式。
  3. 密码模式:密码模式是用户把用户名/密码直接告诉客户端,客户端使用这些信息后授权服务器申请令牌(token)。这需要用户对客户端高度信任,例如3客户端应用和服务提供商就是同一家公司。
  4. 客户端模式:客户端模式是指客户端使用自己的名义而不是用户的名义向服务提估者申请授权。严格来说,客户诺模式并不能算作0Auth协议解决问题的种解决方案,但是对于开发者而言,在一些为移动端提供的授权服务器上使用这种模式还是非常方便的。

-(A) 用户打开客户端以后,客户端要求用户给予授权。

-(B) 用户同意给予客户端授权。

-(C) 客户端使用上一步获得的授权,向认证服务器申请令牌。

-(D) 认证服务器对客户端进行认证以后,确认无误,同意发放令牌。

-(E) 客户端使用令牌,向资源服务器申请获取资源。

-(F)  资源服务器确认令牌无误,同意向客户端开放资源。

从上图中我们可以看出六个步骤之中,B是关键,即用户怎样才能给于客户端授权。同时会发现 OAuth2 中包含四种不同的角色:

。 client : 第三方应用。

。 Resource 0wner: 资源所有者。

。 Authorization Server: 授权服务器。

。 Resource Server:  资源服务器。


2.1 授权码模式

    授权码模式(Authorization code) 是功能最完整、流程最严密、最安全并且使用最广泛的一种0Auth2 授权模式。同时也是最复杂的一种授权模式,它的特点就是通过客户端的后台服务器,与服务提供商的认证服务器进行互动;

Third-party application:第三方应用程序,简称"客户端”(client);

。Resource 0wner:资源所有者,简称"用户” (user) ;

。User Aqent:用户代理,是指浏览器;

。Authorization Server:认证服务器,即服务端专门用来处理认证的服务器;

。Resource Server;资源服务器,即服务端存放用户生成的资源的服务器。它与认证服务器,可以是同一台服务器,也可以是不同的服务器

流程图连接:RFC 6749 - The OAuth 2.0 Authorization Framework

具体流程如下:

(A) 用户访问第三方应用,第三方应用通过浏览器导向认证服务器。

(B) 用户选择是否给予客户端授权。

(C) 假设用户给予授权,认证服务器将用户导向客户端事先指定的"重定向URI”(redirection URI),同时附上一个授权码。

(D) 客户端收到授权码,附上早先的"重定向URI",向认证服务器申请令牌。这一步是在客户端的后台的服务器上完成的,对用户不可见。

(E) 认证服务器核对了授权码和重定向URI,确认无误后,向客户端发送访问令牌 (access token)和更新牌(refresh token)

2.1.1 核心参数

https://wx.com/oauth/authorize?response_type=code&client_id=CLIENT_ID&redirect_uri=http://www.baidu.com&scope=read

2.1.2 参数详解

client_id授权服务器注册应用后的唯一标识
response_type必须 固定值 在授权码中必须为 code
redirect_uri必须 通过客户端注册的重定向URL
scope必须 令牌可以访问资源权限 read 只读   all 读写
state可选 存在原样返回客户端 用来防止 CSRF跨站攻击


2.2  简化模式

    简化模式(simple grant type) 不通过第三方应用程序的服务器,直接在测览器中向认证服务器申请令牌,跳过了"授权码"这个步,因此得名。所有步骤在浏览器中完成,令牌对访问者是可见的,且客户端不需要认证。

其具体的授权流程如图所示:

(A)   第三方应用将用户导向认证服务器

  (B)    用户决定是否给于客户端授权。.

  (C)   假设用户给予授权,认证服务器将用户导向客户端指定的"重定向URI",并在URI的Hash部分包含了访问令牌。#token.

  (D)   浏览器向资源服务器发出请求,其中不包括上一步收到的Hash值。.

  (E)   资源服务器返回一个网页,其中包含的代码可以获取Hash值中的令牌。

  (F)   浏览器执行上一步获得的脚本,提取出令牌。

  (G)   浏览器将令牌发给客户端。

2.2.1  核心参数

https://wx.com/oauth/authorize?response_type=token&client_id=CLIENT_ID&redirect_uri=http://wmw.baidu.com&scope=read

2.2.2  参数详解

参数详解
                字段                    描述
client_id授权服务器注册应用后的唯一标识
response_type必须 固定值 在授权码中必须为token
redirect_uri必须 通过客户端注册的重定向URL
scope必须 令牌可以访问资源权限 read 只读   all 读写
state可选 存在原样返回客户端 用来防止 CSRF跨站攻击


2.3 密码模式

密码模式(Resource 0wner Password Credentias grant)中,用户向客户端提供自己的用户各和密码。客户端使用这些信息,向“服务商提供两"索要授权。在这种模式中,用户必须把自己的密码给客户端,但是客户端不得储存密码。这通常用在用户对客户端高度信任的情下,比如客户端是操作系统的一部分,或者由一个相同公司出品。而认证服务图只有在其他授权模式无法执行的情况下,才能考虑使用这种模式。

其具体的授权流程如图所示

具体步骤如下:

(A) 用户向客户端提供用户名和密码。

(B) 客户端将用户名和密码发给认证服务器,向后者请求令牌。

(C) 认证服务器确认无误后,向客户端提供访间令牌。

2.3.1 核心参数

https://wx.com/token?grant_type=password&username-USERNAME&password=PASSWORD&client_id=CLIENT_ID


2.4 客户端模式

客户端模式(Client Credentials Grant) 指客户端以自己的名义,而不是以用户的名义,向"服务提供商"进行认证。严格地说,客户端模式并不属于0Auth框架所要解决的问题。在这种模式中,用户直接向客户端注册,客户端以自己的名义要求”服务提供商“提供服务,其实不存在授权问题。

授权流程图如下

具体步骤如下:

(A) 客户端向认证服务器进行身份认证,并要求一个访问令牌。

(B) 认证服务器确认无误后,向客户端提供访问令牌。

2.4.1 核心参数

     https://wx.com/token?grant_type=client_credentials&client_secret=CLIENT_SECRET&client_id=CLIENT_ID


三、OAuth2 标准接口

。 /oauth/authorize:  授权端点
。 /oauth/token: 获取令牌端点
。/oauth/confirm_access: 用户确认授权提交端点
。/oauth/error: 授权服务错误信息端点
。/oauth/check_token:  用于资源服务访问的令牌解析端点
。/oauth/token_key: 提供公有密匙的端点,如果使用JWT令牌的话


四、案例实践

使用 gitee 授权登录,登录成功后访问 hello接口,获取授权后的信息

4.1 OAuth2结合Gitee授权案例

打开引用设置:https://gitee.com/oauth/applications

1、进入第三方应用

2、创建应用,填写回调的地址以及主页地址

4.2 后端配置

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {


    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .anyRequest()
                .authenticated()
                .and()
                .oauth2Login();// 使用oauth2 认证,配置从配置文件中读取
    }
}




导入依赖

--所需的依赖
 <!-- oauth2 客户端 -->
       <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-oauth2-client</artifactId>
        </dependency>

 

配置 yml 文件将gitee 加入provider 中

   如果不加的话,启动会报 provider Id not found 相当于要明确指出来

spring:
  security:
    oauth2:
      client:
        registration:
          gitee:
            provider: gitee
            client-id: 83f45xxxf29198ff68ada42f8
            client-secret: 61e7fe7502a0fd162exx429542f739c9ba6322
# 重定向的url地址,这个地址为默认的
            redirect-uri: http://localhost:8082/login/oauth2/code/gitee
            authorization-grant-type: "authorization_code"
            client-name: gitee
        #不配置这个会报 gitee找不到
        provider:
          gitee:
            authorization-uri: https://gitee.com/oauth/authorize
            token-uri: https://gitee.com/oauth/token
            user-info-uri: https://gitee.com/api/v5/user
            user-name-attribute: "name"

4.3 测试controller

  用于授权成功后,获取oauth2的用户信息

@RestController
public class HelloController {


    /**
     *  获取认证后的用户信息
     * @return
     */
    @RequestMapping("hello")
    public DefaultOAuth2User hello() {
        System.out.println("oauth2用户信息获取");
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        return (DefaultOAuth2User)authentication.getPrincipal();

    }

}

4.4 授权效果

   当我们启动项目后,访问 8082接口,自动给我们定向到 gitee授权页面,我们同意后,就会跳到我们配置的主页面了;

4.5 同时开启表单登录

当我们启动项目后,会自动进入到授权页面了,但是有时候我们需要在登录页面加上 gitee的入口,当用户点击后,我们才开始进行授权的操作,这个该怎么做呢,其实我们开启我们的表单认证就好了;

http.authorizeRequests()
                .anyRequest()
                .authenticated()
                .and()
                .formLogin()//开启表单登录
                .and()
                .oauth2Login();// 使用oauth2 认证,配置从配置文件中读取

五、授权过滤器源码查看

   我们肯定在疑问,我们项目里面并没有/login/oauth2/code 这个接口,为什么能访问呢,我们自己加上了 gitee如何就能收到对应的授权呢;

接下来我们来看   OAuth2LoginAuthenticationFilter 源码

5.1 源码入口

org.springframework.security.config.annotation.web.builders.HttpSecurity#oauth2Login()

      org.springframework.security.config.annotation.web.configurers.oauth2.client.OAuth2LoginConfigurer

    org.springframework.security.oauth2.client.web.OAuth2LoginAuthenticationFilter

   DEFAULT_FILTER_PROCESSES_URI = "/login/oauth2/code/*";

5.2  attemptAuthentication() 方法

 attemptAuthentication(HttpServletRequest request, HttpServletResponse response)

org.springframework.security.authentication.AuthenticationManager#authenticate 这一步就是请求 gitee的认证服务器

5.3 OAuth2AuthenticationToken

   当我们通过Oauth2认证成功后,系统会返回一个OAuth2AuthenticationToken对象,同事会将用户信息包装一个 OAuth2User ,对应的实现为DefaultOAuth2User


六、spring security OAuth2 杂谈

该文献参考  哔站  编程不良人 ,有需求可以关注他

     Spring Security 对 0Ath2 提供了很好的支持,这使得我们在 Spring Security中使用 0Auth2 非常地方便。然而由于历史原因,SoringSeaurity对0Auth2的支持比较混乱,这里简单梳理一下。

大约十年前,Spring 引入了一个社区驱动的开源项目 Spring Security 0Auth,并将其纳入 Spring 项目组合中到今天为止,这个项目己经发展成为一个成熟的项目,可以支持大部分0Auth 规范,包括资源服务器、 客户端和授权服务器等。

然而早期的项目存在一些问题,例如:

0Auth 是在早期完成的,开发者无法预料未来的变化以及这些代码到底要被怎么使用.这导致很多 Spring 项目提供了自己的 0Auth 支持,也就带来了 0Auth 支持的碎片化。最早的0Auth项目同时支特 0Auth1. 和 0Auth2.0,而现在0Autb1 早已经不再使用可以放弃了。

现在我们有更多的库可以选择,可以在这些库的基础上去开发,以便更好地支持JWT等新技术。基于以上这些原因,官方决定重写 Spring ecurity 0Auth, 以便更好地协调 Spring 和Auth,并简化代码库,使Spring 的 0Auth 支持更加灵活。然而,在重写的过程中,发生了不少波折。

2018年1月30日,Sprng 官方发了一个通知,表示要逐渐停止现有的 0Ath2支持,然后在 Spring Security 5中构建下一代 Auth2.0 支持。这么做的原因是因为当时 0Auth2 的落地方案比较混乱,在 Spring Security 0Auth、Spring cloud Security、Spring Boot 1.5.x 以及当时最新的Spring Security 5.x 中都提供了对 Auth2 的实现。以至于当开发者需要使用 0Auth2 时,不得不问,到底选哪一个依赖合适呢?所以Spring 官方决定有必要将 Auth2.0 的支持统一到一个项目中,以便为用户提供明确的选择,并避免何潜在的混乱,同时 OAuth20的开发文档也要重新编写,以方便开发人员学习。所有的决定将在 pring Security 5 中开始,构建下一代 Ath2的支持。从那个时候起,Spring Security0Auth项目就正式处于维护模式。官方将提供至少一年的错识/安全修复程序,并且会考虑添加次要功能,但不会添加主要功能。同时将 Spring Security 0Auth中的所有功能重构到 Spring Security 5x中

到了2019年11月14日,Spring 官方又发布-个通知,这次的通知首先表示 Spring Security 0Auth 在往 Spring Security 5.x 的过程非常顺利,大都分迁程工作已经完成了,剩下的将在5.3 版本中完成迁移,在迁移的过程中还添加了许多新功能。包括对 openId  Connect1.0 的支持。同时还宣布将不再支持授权服务器,不支持的原因有两个:

1、在2019年,已经有大量的商业和开源投权服务器可用,

2、授权服务器是使用一个库来构建产品,而 Spring Security 作为框架,并不适合做这件事情

一石激起千层浪,许多开发者表示对此难以接受。这件事也在Spring 社区引发了激烈的讨论,好在 Spring 官方愿意倾听来自社区的声音。

到了2020年4月15日,Spring 官方宣布启动 Spring Authorization server 项目。这是-个由 Spring ecurity 团队领导的社区驱动的项目致力于向 Spring 社区提供 Authorization Server支持,也就是说,Spring 又重新支持授权服务器了。2020年8月21日,Spring Authorization Server 0.0.1正式发布!

这就是 Auth2在Spring 家族中的发展历程了。在后面章节中,客户端和资源服务器都将采用最新的方式来构建,授权服务器依然采用旧的方式来构建因为目前的 Spring Authorization Server 0.0.1功能较少且 BUG 较多。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2127809.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ATF UFS初始化笔记

1. JESD220 中关于UFS初始化的描述 原文 13.1.3 Initialization and boot code download process The initialization and boot code download process is made up of the following phases: partial initialization, boot transfer and initialization completion. 13.1.3.…

果蔬识别系统性能优化之路(四)

目录 前情提要剩下问题 问题排查解决方案下一步 前情提要 果蔬识别系统性能优化之路&#xff08;三&#xff09; 剩下问题 同步数据库数据并初始化ivf依然要8,9秒 问题排查 通过断点加时间打印&#xff0c;发生其实初始化ivf的时间很快&#xff0c;慢的是数据在网络间的传…

【读论文】End-to-end reproducible AI pipelines in radiology using the cloud

文章目录 End-to-end reproducible AI pipelines in radiology using the cloud01 研究背景与目的医学成像领域&#xff08;1&#xff09;研究现状&#xff08;2&#xff09;存在问题 其他研究领域&#xff1a;基因组学&#xff08;genomics&#xff09;研究目的&#xff1a;提…

Vue3使用vue-qrcode-reader实现扫码绑定设备功能

需求描述 移动端进入网站后&#xff0c;登录网站进入设备管理界面。点击添加设备&#xff0c;可以选择直接添加或者扫一扫。点击扫一扫进行扫描二维码获取设备序列号自动填充到添加设备界面的序列号输入框中。然后点击完成进行设备绑定。 安装vue-qrcode-reader 这里使用的版…

《OpenCV计算机视觉》—— 身份证号码识别案例

文章目录 一、案例实现的整体思路二、代码实现1.首先定义两个函数2.模板图像中数字的定位处理3.身份证号码数字的定位处理4.使用模板匹配&#xff0c;计算匹配得分&#xff0c;找到正确结果 一、案例实现的整体思路 下面是一个数字0~9的模板图片 案例身份证如下&#xff1a; 对…

http有什么方法升级成https?

&#x1f512; 获取与安装证书 JoySSL注册填写申请码230907即可领取免费申请资格https://www.joyssl.com/certificate/select/free.html?nid7 &#x1f4c4; 申请SSL证书 选择证书&#xff1a;首先需选择合适的SSL证书&#xff0c;如域名认证&#xff08;DV&#xff09;、公…

120页ppt丨集团公司战略规划内容、方法、步骤及战略规划案例研究

响应会员需求&#xff0c;晓零分享一份经典资料《120页ppt集团公司战略规划内容、方法、步骤及战略规划案例研究》&#xff0c;欢迎进入星球下载学习。 以下是对企业战略规划三个阶段八个步骤的详细解析&#xff1a; 一、阶段一&#xff1a;内外分析 项目启动和前期准备&…

Parallels Desktop 20 发布下载,macOS Sequoia 和 Windows 11 24H2 支持准备就绪

Parallels Desktop for Mac 20.0.0 (build 55653) - 在 Mac 上运行 Windows macOS Sequoia 和 Windows 11 24H2 支持准备就绪 请访问原文链接&#xff1a;https://sysin.org/blog/parallels-desktop/&#xff0c;查看最新版。原创作品&#xff0c;转载请保出处。 作者主页&a…

Java | Leetcode Java题解之第400题第N位数字

题目&#xff1a; 题解&#xff1a; class Solution {public int findNthDigit(int n) {int d 1, count 9;while (n > (long) d * count) {n - d * count;d;count * 10;}int index n - 1;int start (int) Math.pow(10, d - 1);int num start index / d;int digitInde…

wifiip地址可以随便改吗?wifi的ip地址怎么改变

对于普通用户来说&#xff0c;WiFi IP地址的管理和修改往往显得神秘而复杂。本文旨在深入探讨WiFi IP地址是否可以随意更改&#xff0c;以及如何正确地改变WiFi的IP地址。虎观代理小二将详细解释WiFi IP地址的基本概念、作用以及更改时需要注意的事项&#xff0c;帮助用户更好地…

欧盟《人工智能法案》的重点监管要求

文章目录 前言一、欧盟《人工智能法案》的重点监管要求(一)基于风险的监管路径1.具有不可接受风险的人工智能系统2.高风险人工智能系统3.有限风险与低风险人工智能系统(二)对高风险人工智能的监管要求1.针对高风险人工智能系统的要求2.针对高风险人工智能系统产业链参与者的…

shader 案例学习笔记之fract函数

fract函数 可以理解为模1取余&#xff0c;获取一个数的小数部分&#xff0c;如果参数是向量&#xff0c;那就是获取每个向量分量上的小数 案例一 #ifdef GL_ES precision mediump float; #endif// 渲染分辨率 uniform vec2 u_resolution; // 程序运行时间 uniform float u_ti…

【卷起来】VUE3.0教程-08-路由管理

在Vue中&#xff0c;我们可以通过vue-router路由管理页面之间的关系。 Vue Router是Vue.js的官方路由&#xff0c;它与Vue.js核心深度集成&#xff0c;让用Vue.js构建单页应用变得轻而易举。 &#x1f332; 在Vue中引入路由 安装路由 npm install --save vue-router 建立三个…

【C++登堂入室】类和对象(中)——类的6个默认成员函数

目录 一、类的6个默认成员函数 ​编辑二、构造函数 2.1 概念 2.2 特性 三、析构函数 3.1 概念 3.2 特性 四、拷贝构造函数 4.1 概念 4.2 特征 五、赋值运算符重载 5.1 运算符重载 5.2 赋值运算符重载 5.3 前置和后置重载 六、日期类的实现 七、const成员 八、…

气膜建筑:设备吊装口临时封闭的理想选择—轻空间

在设备吊装作业中&#xff0c;吊装口的临时封闭对于保障工作环境安全、设备保护及操作顺利至关重要。传统封闭方式&#xff0c;如钢结构或简易的盖板封闭&#xff0c;不仅耗时耗力&#xff0c;还可能影响施工效率。气膜建筑技术凭借其轻便、快速和高效的特点&#xff0c;为设备…

亚信安全亮相2024国家网安周主会场,多样活动助推行业新发展

9月9日至15日&#xff0c;2024年国家网络安全宣传周在全国范围内统一开展。本届网安周以“网络安全为人民&#xff0c;网络安全靠人民”为主题&#xff0c;亚信安全网安周系列活动在全国30多个城市全面展开&#xff0c;通过线下展览、专题论坛和网络安全知识宣讲等多种形式&…

【软件方案】大屏可视化智能展示平台解决方案(word原件完整版)

构建综合大屏可视化展示平台&#xff0c;旨在整合各业务板块&#xff0c;打造统一大数据分析引擎。此平台将深度融合数据驾驶舱与智慧调度系统&#xff0c;实现对企业运营的全面洞察与高效指挥。我们深入钻研客户信息数据&#xff0c;秉承“大数据”精髓&#xff0c;推动业务模…

【测试八股】软件测试面试八股文

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 以下是软件测试相关的面试题及答案&#xff0c;希望对各位能有帮助&#xff01; 1、测试分为哪几个阶段? 一般来说分为5个阶段&#xff1a;单元测试、集成测试…

警惕!血糖升高初期,这10大微妙信号你捕捉到了吗?

在这个快节奏的时代&#xff0c;饮食不规律、缺乏运动等生活习惯悄然间让高血糖这一“隐形杀手”潜伏在我们身边。然而&#xff0c;高血糖并非悄无声息&#xff0c;它在早期往往会通过一系列微妙却重要的身体信号向我们发出警告。今天&#xff0c;就让我们一同揭开血糖高早期的…

【Unity错误】No cloud project ID was found by the Analytics SDK

在编译默认的URP 2D项目时&#xff0c;出现这样一个错误&#xff1a;No cloud project ID was found by the Analytics SDK. This means Analytics events will not be sent. Please make sure to link your cloud project in the Unity editor to fix this problem. 原因&…