SpringSecurity之Oauth2介绍-程序员宅基地

技术标签: 面试  java  jwt  http  数据库  

Oauth2认证的简单介绍

简介

第三方认证技术方案最主要是解决认证协议的通用标准问题,因为要实现跨系统认证,各系统之间要遵循一定的接口协议。

OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。同时,任何第三方都可以使用OAUTH认证服务,任何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。

业界提供了OAUTH的多种实现如PHP、JavaScript、Java,Ruby等各种语言开发包,大大节约了程序员的时间,因而OAUTH是简易的。

互联网很多服务如Open APl,很多大公司如Google, Yahoo, Microsoft等都提供了OAUTH认证服务,这些都足以说明OAUTH标准逐渐成为开放资源授权的标准。

Oauth协议目前发展到2.0版本,1.0版本过于复杂,2.0版本已得到广泛应用。

Oauth 协议:RFC 6749 - The OAuth 2.0 Authorization Framework (ietf.org)

去年面过一家北京公司开发实习岗位,Authing 是什么 | Authing 文档,是个凉面,它好像也是做这个的。

应用场景

下边分析一个Oauth2认证的例子,网站使用微信认证的过程:

image-20220411170036555
  1. 用户进入网站的登陆界面,点击微信图标以微信账号登陆,该系统,用户是自己在微信里信息的资源拥有者。
image-20220411170334082

点击微信弹出一个二维码,此时用户扫描二维码,开始给网站授权。

image-20220411170711368
  1. 资源拥有者同意给客户端授权

资源拥有者扫描二维码表示资源拥有者同意给客户端授权,微信会对资源拥有者的身份进行验证,验证通过后,微信会询问用户是否给授权网站访问自己的微信数据,用户点击'确认登录"表示同意授权,微信认证服务器会颁发个授权码,并重定向会网站。

image-20220411171148914
  1. 客户端获取到授权码,请求认证服务器申请令牌

此过程用户看不到,客户端应用程序请求认证服务器,请求携带授权码。

  1. 认证服务器向客户端响应令牌

认证服务器验证了客户端请求的授权码,如果合法则给客户端颁发令牌,令牌是客户端访问资源的通行证。此交互过程用户看不到,当客户端拿到令牌后,用户在网站看到已经登录成功,

image-20220411171358946

  1. 客户端请求资源服务器的资源

客户端携带令牌访问资源服务器的资源。网站携带令牌请求访问微信服务器获取用户的基本信息

  1. 资源服务器返回受保护资源

资源服务器校验令牌的合法性,如果合法则向用户响应资源信息内容。

注意:资源服务器和认证服务器也可以是统一个服务器,也可以是分开的服务器。如果是分开的服务器通常要求认证服务器来校验令牌的合法性。

image-20220411173158704

角色

客户端

客户端本身不存储任何的资源,需要通过资源拥有者的授权去请求资源服务器的资源,比如:Andriod客户端、IOS客户端、浏览器端、微信客户端。

资源拥有者

通常为用户,也可以是应用程序,既该资源的拥有者。

授权服务器(认证服务器)

用来对资源拥有者的身份进行认证、对访问资源进行授权。客户端要想访问资源需要通过认证服务器由资源拥有者授权后可访问。

常用术语

  1. 客户凭证 (client Credentials): 客户端的ClientID和密码用于认证客户。
  2. 令牌(tokens): 授权服务器在接受到用户的请求后,颁发的访问令牌
  3. 作用域(scopes): 客户请求访问令牌时,由资源拥有者额外制定的细分权限。

常用令牌

  • 授权码:仅用于授权码授权类型,用于交换获取访问令牌和刷新令牌
  • 访问令牌:用于代表一个用户或服务直接去访问受保护的资源
  • 刷新令牌:用于去授权服务器获取一个刷新访问令牌
  • BearerToken :不管谁拿到Token都可以访问资源,类似现金
  • Proof of Possession (Pop) Token:可以校验 client 是否对Token有明确的拥有权

特点

优点

  • 更安全,客户端不接触用户密码,服务器端更易集中保护
  • 广泛传播并被持续采用
  • 短寿命和封装的token
  • 资源服务器和授杈服务器解耦
  • 集中式授权,简化客户端
  • HTTP/JSON友好,易于请求和传递token
  • 考虑多种客户端架构场景
  • 客户可以具有不同的信任级别

缺点

  • 协议框架太竞泛,造成各种实现的兼容性和互操作性差
  • 只是一个认证协议,本身并不能告诉你任何用户信息。

授权模式

授权码模式

image-20220411175444108

简化授权码模式

image-20220411180114815

密码模式

image-20220411180153181

客户端模式

image-20220411180255114

刷新令牌

image-20220411180421541

SpringSecurity Oauth2

授权服务器

image-20220411180829486
  • Authorize Endpoint :授权端点,进行授权
  • Token Endpoint :令牌端点,进过授权拿到对应的Token
  • Introspection Endpoint:校验端点,校验Token的合法性
  • Revocat ion Endpoint :撤销端点,撒销授权

SpringSecurity Oauth2的架构

image-20220411181042001

流程

  1. 用户访问,此时没有Token。Oauth2RestTemplate会报错,这个报错信息会被Oauth2ClientContextFiter捕获。并重定向到认证服务器

  2. 认证服务器通过Authorization Endpoint进行授权,并通过AuthorizationServerTokenServices生成授权码并返回给客户端。

  3. 客户端拿到授权码去认证服务器通过Token Endpoint调用AuthorizationServerTokenServices生成Token并返回给客户端。

SpringBoot整合SpringSecurity Oauth2

实现授权码模式

代码和测试文档

https://github.com/bearbrick0/SpringSecurityOauth2_demo

实现密码模式

代码和测试文档

https://github.com/bearbrick0/Oauth_password_demo

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_46487176/article/details/124114320

智能推荐

​IPLOOK助力5G-Advanced网络演进​_iplook的业务分析-程序员宅基地

文章浏览阅读2.9k次。自2019年我国正式发放5G商用牌照,我国的5G网络部署飞速发展,5G技术逐渐渗透千行百业,越来越多的5G行业应用也随之落地, 基于此,5G网络的后续演进(5G-Advanced)方向及趋势更是引起了行业内外的高度关注。IPLOOK参与制订的5G-Advanced网络技术演进白皮书(2021)从架构和技术两个层面清晰阐述了5G-Advanced的未来发展方向,让我们一探究竟!一、架构层面发展5G-Advanced网络的最终目的在于云网融合、算网一体,因此架构层面的三个发展特征如下:•云原生(._iplook的业务分析

在 Java 中创建一个 2D ArrayList列表集合的两种不同方法_java怎么动态生成2d列表-程序员宅基地

文章浏览阅读1.7k次,点赞2次,收藏5次。使用固定大小数组在 Java 中创建 2d ArrayList通过创建 ArrayList 的 ArrayList 在 Java 中创建 2D ArrayList_java怎么动态生成2d列表

在outlook客户端设置阿里企业邮箱_阿里邮箱outlook设置-程序员宅基地

文章浏览阅读5.9k次。如果选择加密方式,注意将默认的端口号修改为加密的端口号!_阿里邮箱outlook设置

asterisk 相关数据库配置 使用-程序员宅基地

文章浏览阅读170次。Linux/Unix下ODBC的安装:  先下载最新的unixODBC源码包(http://www.unixodbc.org/unixODBC-2.2.1.tar.gz)放到/usr/local下,然后运行下述命令:  tar zxvf unixODBC-2.2.1.tar.gz  cd unixODBC-2.2.1  ./configure --prefix=/usr/local..._asterisk-addons-1.6.2

mtk 改用Release Key签名.并增加签名证书._mtk releasekey-程序员宅基地

文章浏览阅读1.4k次。build/target/product/security/mbk82_tb_kk/.pass[new file with mode: 0644]blobbuild/target/product/security/mbk82_tb_kk/keys.conf[new file with mode: 0644]blobbuild/target/product/security/mbk82_tb_mtk releasekey

关于旁路电容和耦合电容精讲_耦合电容 0.1uf 100v-程序员宅基地

文章浏览阅读4.3k次。从电路来说,总是存在驱动的源和被驱动的负载.如果负载电容比较大,驱动电路要把电容充电、放电,才能完成信号的跳变,在上升沿比较陡峭的时候,电流比较大,这样驱动的电流就会吸收很大的电源电流,由于电路中的电感,电阻(特别是芯片管脚上的电感,会产生反弹),这种电流相对于正常情况来说实际上就是一种噪声,会影响前级的正常工作.这就是耦合. 去藕电容就是起到一个电池的作用,满足驱动电路电流的变化,避免相互间的耦合干扰. 旁路电容实际也是去藕合的,只是旁路电容一般是指高频旁路,也就是给高频的开关噪声提高一条低阻_耦合电容 0.1uf 100v

随便推点

第2代:晶体管数字机(1958—1964年)-程序员宅基地

文章浏览阅读3.7k次。第2代:晶体管数字机(1958—1964年)硬件方的操作系统、高级语言及其编译程序。应用领域以科学计算和事务处理为主,并开始进入工业控制领域。特点是体积缩小、能耗降低、可靠性提高、运算速度提高(一般为每秒数10万次,可高达300万次)、性能比第1代计算机有很大的提高。_晶体管数字机图片大全

php命令执行_<?php $a = $____get['a']; system($a); ?>-程序员宅基地

文章浏览阅读735次。前一篇写了代码执行代码执行跟命令执行的区别是代码执行的是php代码 比如echo 123; phpinfo()等,命令执行执行的是系统命令,whoami ,net user ,看起来好像命令执行的危害更高一点,但是通过代码执行也可调用系统命令的函数如 system('whoami'),所以危害一样大。1.system()(PHP 4, PHP 5, PHP 7, PHP 8)system—执行外部程序,并且显示输出,有回显<?php$a=$_GET['id'];syst..._

SSH服务配置_ssh配置-程序员宅基地

文章浏览阅读1.1w次,点赞6次,收藏36次。SSH(Secure Shell)是一种安全通道协议,主要用来实现字符界面的远程登录、远程 复制等功能。SSH 协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令,SSH 为建立在应用层和传输层基础上的安全协议。对数据进行压缩,加快传输速度。SSH客户端SSH服务端优点:数据传输是加密的,可以防止信息泄漏数据传输是压缩的,可以提高传输速度。_ssh配置

iPhone网络编程初体验-程序员宅基地

文章浏览阅读188次。使用网络通信流  使用套接字在网络上通信最简单的方法是使用NSStream类,NSStream类是一个表示流的抽象类,你可以使用它读写数据,它可以用在内存、文件或网络上。使用NSStream类,你可以向服务器写数据,也可以从服务器读取数据。  在Mac OS X上,可以使用NSHost和NSStream对象建立到服务器的连接,如:1 NSInputStream *iSt_iphone网络编程

偏向锁 / 轻量级锁 / 重量级锁-程序员宅基地

文章浏览阅读79次。原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11395931.html锁的状态无锁状态偏向锁状态轻量级锁状态重量级锁状态锁的状态是通过对象监视器在对象头中的字段来表明的。为了提升性能,JDK1.6引入了偏向锁、轻量级锁、重量级锁概念,来减少锁竞争带来的上下文切换,而正是新增的Java对象头实现了锁..._重量级锁会让其他申请的线程进入阻塞

解决Mysql不能保存中文的问题_innodb 保存中文报错-程序员宅基地

文章浏览阅读7.7k次。解决Mysql不能保存中文的问题。最经在做项目的时候遇到了一个很头痛的问题,就是Mysql不能保存中文,一保存就显示为??,本来我用是数据库是MSSql,但由于业务的需求,改用Mysql数据库,经过几天的探索,我终于找到了解决Mysql不能保存中文的方法第一:在建表的时候需要在字段的后面指定字符集,例如下边这张表:CREATE TABLE admin(pkId varchar (5_innodb 保存中文报错