1.认识OAuth2.0

简介: OAuth2.0是一种开放授权标准,允许第三方应用在用户授权下安全访问资源,无需获取用户账号密码。文中介绍了其四大授权模式:授权码模式(最安全,适用于Web应用)、简化模式(适用于前端单页应用)、密码模式(需高度信任)和客户端模式(服务间调用)。通过案例解析,说明OAuth2.0如何实现服务间资源共享与单点登录,提升系统安全性与用户体验。

1.认识OAuth2.0

1.什么是OAuth2.0
先说OAuth,OAuth是Open Authorization的简写。 OAuth协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAuth的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与 密码就可以申请获得该用户资源的授权,因此OAuth是安全的。
OAuth2.0是OAuth协议的延续版本,但不向前兼容(即完全废止了OAuth1.0)。
2.OAuth2.0使用场景
假设,A网站是一个打印照片的网站,B网站是一个存储照片的网站,二者原本毫无关联。
如果一个用户想使用A网站打印自己存储在B网站的照片,那么A网站就需要使用B网站的照片资源才行。 按照传统的思考模式,我们需要A网站具有登录B网站的用户名和密码才行,但是有OAuth2后,只需要A网站获取到使用B网站照片资源的一个通行令牌即可!这个令牌无需具备操作B网站所有资源的权限,也无需永久有效,只要满足A网站打印照片需求即可。
这么听来,是不是有点像单点登录?千万不要混淆概念!单点登录是用户一次登录,自己可以操作其 他关联的服务资源。OAuth2则是用户给一个系统授权,可以直接操作其他系统资源的一种方式。
总结一句:SpringSecurity的OAuth2可以做服务之间资源共享,也可以实现单点登录!
3.OAuth2.0四种授权模式
针对上面的获取照片,我们结合下图进行详细展开

B服务[存储照片

B服务认证服务

A服务认证服务

A服务[打印照片]

B服务资源服务

A服务客户端


授权码模式
流程
说明:【A服务客户端】需要用到【B服务资源服务】中的资源
第一步:【A服务客户端】将用户自动导航到【B服务认证服务】,这一步用户需要提供一个回调地址,以备 【B服务认证服务】返回授权码使用。
第二步:用户点击授权按钮表示让【A服务客户端】使用【B服务资源服务】,这一步需要用户登录B服务,也就是说用户要事先具有B服务的使用权限。
第三步:【B服务认证服务】生成授权码,授权码将通过第一步提供的回调地址,返回给【A服务客户端】。 注意这个授权码并非通行【B服务资源服务】的通行凭证。
第四步:【A服务认证服务】携带上一步得到的授权码向【B服务认证服务】发送请求,获取通行凭证token。
第五步:【B服务认证服务】给【A服务认证服务】返回令牌token和更新令牌refresh token。
场景
授权码模式是OAuth2中最安全最完善的一种模式,应用场景最广泛,可以实现服务之间的调用,常见的微信,QQ等第三方登录也可采用这种方式实现。
简化模式
流程
说明:简化模式中没有【A服务认证服务】这一部分,全部有【A服务客户端】与B服务交互,整个过程不再有授权码,token直接暴露在浏览器。
第一步:【A服务客户端】将用户自动导航到【B服务认证服务】,这一步用户需要提供一个回调地址,以备【B服务认证服务】返回token使用,还会携带一个【A服务客户端】的状态标识state。
第二步:用户点击授权按钮表示让【A服务客户端】使用【B服务资源服务】,这一步需要用户登录B服务,也就是说用户要事先具有B服务的使用权限。
第三步:【B服务认证服务】生成通行令牌token,token将通过第一步提供的回调地址,返回给【A服务客户端】。
场景
适用于A服务没有服务器的情况。比如:纯手机小程序,JavaScript语言实现的网页插件等。
密码模式
流程
第一步:直接告诉【A服务客户端】自己的【B服务认证服务】的用户名和密码
第二步:【A服务客户端】携带【B服务认证服务】的用户名和密码向【B服务认证服务】发起请求获取token。
第三步:【B服务认证服务】给【A服务客户端】颁发token。
场景
此种模式虽然简单,但用户将B服务的用户名和密码暴露给A服务,需要两个服务信任度很高才能使用。
客户端模式
流程
说明:这种模式其实已经不太属于OAuth2范畴。A服务完全脱离用户,以自己的身份去向B服务索取token。换言之用户无需具备B服务的使用权也可以。完全是A服务与B服务内部交互,与用户无关了。
第一步:A服务向B服务索取token。
第二步:B服务返回token给A服务。
场景
A服务本身需要B服务资源,与用户无关。

1 人点赞

1


相关文章
|
2天前
|
uml C语言
系统时序图
时序图(Sequence Diagram)是UML中描述对象间消息传递时间顺序的交互图,横轴为对象,纵轴为时间。它用于展示系统动态协作过程,强调交互的时间先后关系,直观呈现并发行为。主要元素包括角色、对象、生命线、控制焦点和消息等,广泛应用于软件设计建模。
系统时序图
|
2天前
|
消息中间件 存储 数据挖掘
应用架构图
本文介绍应用架构图的设计原理,涵盖单体与分布式架构模式。重点解析展现层、业务层、数据层及基础通用层的分层设计,阐述系统间调用关系与外部依赖,明确应用边界,指导技术方案落地。
|
2天前
|
消息中间件 运维 物联网
语音通知
语音通知服务适用于科技公司服务器或物联网设备异常时的告警通知。通过语音电话形式,向处理人播报预设模板内容,支持变量替换实现个性化提醒。需开通语音服务并申请资质、话术、号码及模板,可通过API发起呼叫并查询记录,支持主动查询与消息回执两种结果获取方式,提升运维响应效率。
语音通知
|
1天前
|
项目管理 开发者
业务架构图
业务架构图是梳理业务层级与关系的工具,通过分层、分模块、分功能,抽象出业务核心结构,明确各部分职责与协作,服务于客户理解与系统开发,是连接业务与技术的重要桥梁。
Day07
简介:本文讲解CAP与BASE理论核心要点,阐述分布式系统中一致性、可用性与分区容错性的权衡,解析Seata AT模式的执行流程,并探讨MQ消息防丢失、重复消费及积压处理等关键问题。
Day07
|
1天前
|
运维 Devops 开发工具
生产环境缺陷管理
针对大型团队多分支开发中bug管理难题,本文介绍基于go-git实现的分布式工具git-poison,通过“投毒-解药-银针”机制,实现bug的自动化追溯、发布卡点与影响范围精准识别,有效避免人为疏漏导致的生产事故,提升缺陷管理效率与系统稳定性。
生产环境缺陷管理
|
1天前
|
Dubbo Java 应用服务中间件
Day02
Day02:掌握Spring Cloud Gateway原理,基于Netty实现非阻塞请求转发;项目采用OpenFeign进行远程调用;深入JVM模型、垃圾回收、类加载及调优。
Day02
|
1天前
|
负载均衡 Dubbo 应用服务中间件
Day01
本文介绍微服务架构的适用场景及技术选型,对比单体与微服务优劣,详解Nacos与Eureka注册中心的心跳机制、服务治理差异,并涵盖常见负载均衡算法及SpringCloud Alibaba常用组件实践。
 Day01
|
1天前
|
存储 安全 算法
第一章 Java基础
本章系统讲解Java基础核心知识,涵盖重载与重写、==与equals、String三兄弟区别、异常体系、集合类原理(如HashMap结构与扩容)、线程并发(ThreadLocal、锁机制)、JVM内存模型、Lambda表达式、反射泛型及Tomcat优化等内容,深入浅出,助力夯实Java基础。
第一章 Java基础
|
1天前
|
存储 缓存 Java
自定义注解
本文介绍Java自定义注解的实现原理与应用,结合Spring AOP 和过滤器实现日志、权限控制及登录验证,涵盖注解定义、@Target、@Retention等核心语法,并通过代码示例展示实际使用流程。
 自定义注解