Spring中的OAuth2

一. 什么是OAuth2

“Auth” 表示 “授权” Authorization

“O” 是 Open 的简称,表示 “开放”

连在一起就表示 “开放授权”,OAuth2是一种开放授权协议。

二. OAuth2是什么 怎么用

OAuth2是目前最流行的授权协议,用来授权第三方应用,获取用户数据。 举个例子:快递员想要进入小区,有3种方式。1是业主远程开门,2是业主告诉门禁密码,3是使用令牌(Oauth2)。
在这里插入图片描述
令牌和密码的区别:令牌相当于火车票,密码相当于是钥匙。
● 令牌是短期的,自动失效。密码是长期有效。
● 令牌是可以撤销的,撤销立即生效。密码一般不允许他们撤销。
● 令牌有权限范围,如车票座位为10车A15座。密码一般是完整权限。

四.OAuth2的四种授权模式

第一种方式:授权码

授权码(authorization code),指的是第三方应用先申请一个授权码,然后再用该码获取令牌。

这种方式是最常用,最复杂,也是最安全的,它适用于那些有后端的 Web 应用。授权码通过前端传送,令牌则是储存在后端,而且所有与资源服务器的通信都在后端完成。这样的前后端分离,可以避免令牌泄漏。
在这里插入图片描述

第二种方式:隐藏式

隐藏式(implicit),也叫简化模式,有些 Web 应用是纯前端应用,没有后端。这时就不能用上面的方式了,必须将令牌储存在前端。

RFC 6749 规定了这种方式,允许直接向前端颁发令牌。这种方式没有授权码这个中间步骤,所以称为隐藏式。这种方式把令牌直接传给前端,是很不安全的。因此,只能用于一些安全要求不高的场景,并且令牌的有效期必须非常短,通常就是会话期间(session)有效,浏览器关掉,令牌就失效了。
在这里插入图片描述

第三种方式:密码式

密码式(Resource Owner Password Credentials):如果你高度信任某个应用,RFC 6749 也允许用户把用户名和密码,直接告诉该应用。该应用就使用你的密码,申请令牌。

这种方式需要用户给出自己的用户名/密码,显然风险很大,因此只适用于其他授权方式都无法采用的情况,而且必须是用户高度信任的应用。
在这里插入图片描述

第四种方式:凭证式

凭证式(client credentials):也叫客户端模式,适用于没有前端的命令行应用,即在命令行下请求令牌。

这种方式给出的令牌,是针对第三方应用的,而不是针对用户的,即有可能多个用户共享同一个令牌。
在这里插入图片描述

五.Spring中的OAuth2

Spring中的实现

具体参考官网OAuth2 :: Spring Security
Spring Security

  • 客户应用(OAuth2 Client):OAuth2客户端功能中包含OAuth2 Login

  • 资源服务器(OAuth2 Resource Server)

  • Spring

  • 授权服务器(Spring Authorization Server):它是在Spring Security之上的一个单独的项目。

相关依赖

<!-- 资源服务器 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency><!-- 客户应用 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency><!-- 授权服务器 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-oauth2-authorization-server</artifactId>
</dependency>

授权登录的实现思路

使用OAuth2 Login
在这里插入图片描述

GiuHub社交登录案例

创建应用

注册客户应用:

登录GitHub,在开发者设置中找到OAuth Apps,创建一个application,为客户应用创建访问GitHub的凭据:
在这里插入图片描述
填写应用信息:默认的重定向URI模板为{baseUrl}/login/oauth2/code/{registrationId}。registrationId是ClientRegistration的唯一标识符。
在这里插入图片描述
获取应用程序id,生成应用程序密钥:
在这里插入图片描述

创建测试项目

创建一个springboot项目oauth2-login-demo,创建时引入如下依赖
在这里插入图片描述

application.yml:

spring:security:oauth2:client:registration:github:client-id: 7807cc3bb1534abce9f2client-secret: 008dc141879134433f4db7f62b693c4a5361771b
#            redirectUri: http://localhost:8200/login/oauth2/code/github

创建Controller

@Controller
public class IndexController {@GetMapping("/")public String index(Model model,@RegisteredOAuth2AuthorizedClient OAuth2AuthorizedClient authorizedClient,@AuthenticationPrincipal OAuth2User oauth2User) {model.addAttribute("userName", oauth2User.getName());model.addAttribute("clientName", authorizedClient.getClientRegistration().getClientName());model.addAttribute("userAttributes", oauth2User.getAttributes());return "index";}
}

创建html页面

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org" xmlns:sec="https://www.thymeleaf.org/thymeleaf-extras-springsecurity5">
<head><title>Spring Security - OAuth 2.0 Login</title><meta charset="utf-8" />
</head>
<body>
<div style="float: right" th:fragment="logout" sec:authorize="isAuthenticated()"><div style="float:left"><span style="font-weight:bold">User: </span><span sec:authentication="name"></span></div><div style="float:none">&nbsp;</div><div style="float:right"><form action="#" th:action="@{/logout}" method="post"><input type="submit" value="Logout" /></form></div>
</div>
<h1>OAuth 2.0 Login with Spring Security</h1>
<div>You are successfully logged in <span style="font-weight:bold" th:text="${userName}"></span>via the OAuth 2.0 Client <span style="font-weight:bold" th:text="${clientName}"></span>
</div>
<div>&nbsp;</div>
<div><span style="font-weight:bold">User Attributes:</span><ul><li th:each="userAttribute : ${userAttributes}"><span style="font-weight:bold" th:text="${userAttribute.key}"></span>: <span th:text="${userAttribute.value}"></span></li></ul>
</div>
</body>
</html>

启动应用程序

  • 启动程序并访问localhost:8080。浏览器将被重定向到默认的自动生成的登录页面,该页面显示了一个用于GitHub登录的链接。
  • 点击GitHub链接,浏览器将被重定向到GitHub进行身份验证。
  • 使用GitHub账户凭据进行身份验证后,用户会看到授权页面,询问用户是否允许或拒绝客户应用访问GitHub上的用户数据。点击允许以授权OAuth客户端访问用户的基本个人资料信息。
  • 此时,OAuth客户端访问GitHub的获取用户信息的接口获取基本个人资料信息,并建立一个已认证的会话。

登录流程分析

  1. A 网站让用户跳转到 GitHub,并携带参数ClientID 以及 Redirection URI。
  2. GitHub 要求用户登录,然后询问用户"A 网站要求获取用户信息的权限,你是否同意?"
  3. 用户同意,GitHub 就会重定向回 A 网站,同时发回一个授权码。
  4. A 网站使用授权码,向 GitHub 请求令牌。
  5. GitHub 返回令牌.
  6. A 网站使用令牌,向 GitHub 请求用户数据。
  7. GitHub返回用户数据
  8. A 网站使用 GitHub用户数据登录

在这里插入图片描述

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

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

相关文章

信号的小波包能量谱计算(以轴承振动信号为例,Python环境)

小波分析是近30年来发展起来的数学分支&#xff0c;是Fourier分析划时代发展的结果&#xff0c;由法国工程师Morlet首先提出&#xff0c;后广泛应用于信号处理、图像处理与分析、地震勘探、故障诊断、自动控制等领域&#xff0c;小波就是小的波形&#xff0c;所谓“小”是指它具…

QT文件读写操作和内容提取

访问IO设备&#xff0c;需要先调用open()来设置正确的OpenMode(例如ReadOnly或ReadWrite) 打开设备后后&#xff0c;使用write() 或putChar() 写入数据到文件和设备&#xff0c;并通过调用read()&#xff0c;readLine() 或readAll() 进行读取&#xff1b;使用完设备后&#xf…

供应链攻击揭秘:识别、防范与应对

供应链攻击是网络安全领域的一种新兴威胁&#xff0c;它利用供应链中的漏洞对目标进行攻击。本文将介绍供应链攻击的概念、类型、危害&#xff0c;并通过具体案例阐述其影响&#xff0c;同时探讨如何防范供应链攻击&#xff0c;以提高人们对供应链攻击的认识和防范意识。 一、引…

3、Jenkins持续集成-Jenkins安装和插件管理

文章目录 一、Jenkins安装1. 安装JDK2. 获取jenkins安装包3. 安装包上传到服务器&#xff0c;进行安装4. 修改Jenkins配置&#xff08;1&#xff09;低版本Jenkins的rpm包&#xff08;2&#xff09;高版本Jenkins的rpm包 5. 启动Jenkins6. 打开浏览器访问7. 获取并输入admin账户…

【漏洞复现】netgear路由器 boarddataww 存在RCE漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

HTML发展史

为什么要讲 HTML 发展史呢&#xff1f; 唐太宗告诉我们: 以铜为镜&#xff0c;可以正衣冠&#xff1b;以史为镜&#xff0c;可以知兴替&#xff1b;以人为镜&#xff0c;可以明得失。 那了解了 HTML 的发展史&#xff0c;可以知道什么呢&#xff1f; 答案是兼容 国内在 淘宝…

FDM3D打印系列——美纹纸遮挡喷漆

大家好&#xff0c;我是阿赵。   自从上次尝试了水补土和喷漆&#xff0c;发现效果不错之后&#xff0c;我就接着进行第二次的尝试了。   这次打印的模型是这个拳皇里面的卢卡尔&#xff0c;别看拍照好像很高大&#xff0c;其实这个模型很小的&#xff0c;只有10cm左右的高…

C#获取HTML源码

C#获取HTML源码 2024年03月23日记录 以前的那个从网上找到的方法, 在一些网站上用不了&#xff0c;如17K&#xff0c;取出来的是乱码&#xff0c;要么就是一坨JS&#xff0c;好像是用JS又重新加载了什么的 using System; using System.Collections.Generic; using System.We…

面试 Java 基础八股文十问十答第二十期

面试 Java 基础八股文十问十答第二十期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01;关注专栏后就能收到持续更新&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;HashMap 和 Concurre…

打造全网最全Doris面试题(100个问题2万字)

在大数据领域,Doris作为一款高性能、易扩展的MPP(Massively Parallel Processing)分析数据库,受到了越来越多企业的青睐。作为一名大数据架构师,了解Doris的核心特性和面试题是至关重要的。本文将为您提供一系列Doris面试题的参考答案,帮助您在面试中游刃有余,同时也为您…

PySide6-YOLO8目标检测、追踪可视化界面

目录 项目地址实现效果DetectTrack 项目地址 https://github.com/zhengjie9510/pyside-yolo 实现效果 Detect Track

windows安装ssh

一、下载ssh https://github.com/PowerShell/Win32-OpenSSH/releases/download/v8.1.0.0p1-Beta/OpenSSH-Win64.zip 二、安装ssh 解压到C:\Program Files\OpenSSH-Win64 配置环境变量 把 C:\Program Files\OpenSSH-Win64 加到path环境变量里面 C:\Program Files\OpenSSH-Win64&…

JDK1.8新特性——Stream流方法引用

文章目录 Stream流如何获取流水线Stream流中间方法Stream终结方法 方法引用引用静态方法引用成员方法引用构造方法类名引用成员方法引用数组构造方法 Stream流 Stream流是JDK8中提供的一种新特性 Stream流的使用步骤&#xff1a; 先得到Stream流&#xff0c;把数据放到流中使…

七、大模型-什么是Fine-tuning

好文推荐 推荐一篇比较透彻的介绍 对于深度学习模型中的 Fine-tuning&#xff08;微调&#xff09;操作&#xff0c;以下是详细介绍和原理说明&#xff1a; 什么是 Fine-tuning&#xff08;微调&#xff09;&#xff1f; Fine-tuning 是指在一个已经训练好的模型基础上&am…

Arcgis 导入经纬度坐标、导出经纬度坐标

目录 一、导入经纬度坐标 1、在excel中准备好经纬度坐标的数据表 2、将数据放入Acrgis的工作路径 3、在arcgis中添加数据 4、显示经纬度坐标点 5、导出为shp矢量文件 二、根据shp的经纬度坐标点导出成经纬度坐标 1、右键选择打开属性表 2、在属性表的菜单下拉栏里找到…

三、阅读器的开发--1、项目准备

1、项目准备 1.1、项目搭建 我用的脚手架是vue cli 5.0的&#xff0c;通过vue create 项目名称来创建的项目 上下箭头选的是最后那个&#xff0c;是指手动配置&#xff0c;然后回车 空格选中下面这些&#xff0c;然后回车 下图最后那个指我们所有的配置在哪里配置&#xff0…

c++ 线程池/Github 开源项目源码分析(progschj/ThreadPool)

c 线程池/Github 开源项目源码分析&#xff08;progschj/ThreadPool&#xff09; 前言[ThreadPool 项目地址](https://github.com/progschj/ThreadPool)项目源码&#xff1a;基本用法类成员变量类成员函数构造函数的签名创建线程线程默认的任务向任务队列中添加一个任务析构函数…

open images v7的600类别名称

英文&#xff1a; 0: Accordion1: Adhesive tape2: Aircraft3: Airplane4: Alarm clock5: Alpaca6: Ambulance7: Animal8: Ant9: Antelope10: Apple11: Armadillo12: Artichoke13: Auto part14: Axe15: Backpack16: Bagel17: Baked goods18: Balance beam19: Ball20: Balloon21…

【Rust】Shared-State Concurrency

Shared-State Concurrency channel类似于single ownership. 而shared memory类似与multiple ownership. multiple ownership是难于管理的. smarter pointer也是multiple ownership的. Rust的type system和ownership rules帮助实现正确的multiple ownership管理。 Using Mute…

百度智能云+SpringBoot=AI对话【人工智能】

百度智能云SpringBootAI对话【人工智能】 前言版权推荐百度智能云SpringBootAI对话【人工智能】效果演示登录AI对话 项目结构后端开发pom和propertiessql_table和entitydao和mapperservice和implconfig和utilLoginController和ChatController 前端开发css和jslogin.html和chat.…