SSO 单点登录和 OAuth2.0 的区别和理解

简介: SSO 单点登录和 OAuth2.0 的区别和理解


一、概述

SSO是Single Sign On的缩写,OAuth是Open Authority的缩写,这两者都是使用令牌的方式来代替用户密码访问应用。流程上来说他们非常相似,但概念上又十分不同。SSO大家应该比较熟悉,它将登录认证和业务系统分离,使用独立的登录中心,实现了在登录中心登录后,所有相关的业务系统都能免登录访问资源。

OAuth2.0原理可能比较陌生,但平时用的却很多,比如访问某网站想留言又不想注册时使用了微信授权。以上两者,你在业务系统中都没有账号和密码,账号密码是存放在登录中心或微信服务器中的,这就是所谓的使用令牌代替账号密码访问应用。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

二、SSO

两者有很多相似之处,下面我们来解释一下这个过程。先来讲解SSO,通过SSO对比OAuth2.0,才比较好理解OAuth2.0的原理。SSO的实现有很多框架,比如CAS框架,以下是CAS框架的官方流程图。特别注意:SSO是一种思想,而CAS只是实现这种思想的一种框架而已

上面的流程大概为:

  • 用户输入网址进入业务系统Protected App,系统发现用户未登录,将用户重定向到单点登录系统CAS Server,并带上自身地址service参数
  • 用户浏览器重定向到单点登录系统,系统检查该用户是否登录,这是SSO(这里是CAS)系统的第一个接口,该接口如果用户未登录,则将用户重定向到登录界面,如果已登录,则设置全局session,并重定向到业务系统
  • 用户填写密码后提交登录,注意此时的登录界面是SSO系统提供的,只有SSO系统保存了用户的密码,
  • SSO系统验证密码是否正确,若正确则重定向到业务系统,并带上SSO系统的签发的ticket
  • 浏览器重定向到业务系统的登录接口,这个登录接口是不需要密码的,而是带上SSO的ticket,业务系统拿着ticket请求SSO系统,获取用户信息。并设置局部session,表示登录成功返回给浏览器sessionId(tomcat中叫JSESSIONID)
  • 之后所有的交互用sessionId与业务系统交互即可

最常见的例子是,我们打开淘宝APP,首页就会有天猫、聚划算等服务的链接,当你点击以后就直接跳过去了,并没有让你再登录一次

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

三、OAuth2.0

OAuth2.0有多种模式,这里讲的是OAuth2.0授权码模式,OAuth2.0的流程跟SSO差不多,在OAuth2中,有授权服务器、资源服务器、客户端这样几个角色,当我们用它来实现SSO的时候是不需要资源服务器这个角色的,有授权服务器和客户端就够了。

授权服务器当然是用来做认证的,客户端就是各个应用系统,我们只需要登录成功后拿到用户信息以及用户所拥有的权限即可

  • 用户在某网站上点击使用微信授权,这里的某网站就类似业务系统,微信授权服务器就类似单点登录系统
  • 之后微信授权服务器返回一个确认授权页面,类似登录界面,这个页面当然是微信的而不是业务系统的
  • 用户确认授权,类似填写了账号和密码,提交后微信鉴权并返回一个ticket,并重定向业务系统。
  • 业务系统带上ticket访问微信服务器,微信服务器返回正式的token,业务系统就可以使用token获取用户信息了

简介一下OAuth2.0的四种模式:

授权码(authorization-code)

授权码(authorization code)方式,指的是第三方应用先申请一个授权码,然后再用该码获取令牌。这种方式是最常用的流程,安全性也最高,它适用于那些有后端的 Web 应用。授权码通过前端传送,令牌则是储存在后端,而且所有与资源服务器的通信都在后端完成。这样的前后端分离,可以避免令牌泄漏。

隐藏式(implicit)

有些 Web 应用是纯前端应用,没有后端。这时就不能用上面的方式了,必须将令牌储存在前端。RFC 6749 就规定了第二种方式,允许直接向前端颁发令牌。这种方式没有授权码这个中间步骤,所以称为(授权码)“隐藏式”(implicit)

密码式(password)

如果你高度信任某个应用,RFC 6749 也允许用户把用户名和密码,直接告诉该应用。该应用就使用你的密码,申请令牌,这种方式称为"密码式"(password)。

客户端凭证(client credentials)

最后一种方式是凭证式(client credentials),适用于没有前端的命令行应用,即在命令行下请求令牌。

简单流程

四、说一下几个名词的区别

首先,SSO 是一种思想,或者说是一种解决方案,是抽象的,我们要做的就是按照它的这种思想去实现它

其次,OAuth2 是用来允许用户授权第三方应用访问他在另一个服务器上的资源的一种协议,它不是用来做单点登录的,但我们可以利用它来实现单点登录。在本例实现SSO的过程中,受保护的资源就是用户的信息(包括,用户的基本信息,以及用户所具有的权限),而我们想要访问这这一资源就需要用户登录并授权,OAuth2服务端负责令牌的发放等操作,这令牌的生成我们采用JWT,也就是说JWT是用来承载用户的Access_Token的

最后,Spring Security、Shiro 是用于安全访问的,用来做访问权限控制,都是一个用Java写的框架



相关文章
|
9月前
|
存储 弹性计算 运维
阿里云通用算力型U1实例怎么样?u1实例技术架构、场景适配与优惠价格参考
阿里云服务器ECS 通用算力型u1实例2核4G,5M固定带宽,80G ESSD Entry盘,企业用户专享优惠价格199元1年,很多用户关心这个款云服务器怎么样?阿里云通用算力型U1实例自推出以来,凭借独特的"均衡算力+智能调度"设计理念,在IaaS市场开辟出差异化的竞争赛道。本文将通过技术架构解析、典型场景适配分析、全生命周期成本测算三个维度,全面解构这款热门云服务器实例的核心价值,以供参考和选择。
|
监控 安全 网络安全
状态检测防火墙
【8月更文挑战第17天】
1132 3
ROS2教程 09 bag
本文是一篇关于ROS2中bag工具使用的教程,介绍了如何记录、回放和查看话题信息的命令和步骤。
939 5
|
关系型数据库 MySQL 数据库连接
如何处理WordPress网站提示“建立数据库连接时出错”
如何处理WordPress网站提示“建立数据库连接时出错”
|
并行计算 Java 调度
深入理解Java并发工具包中的CyclicBarrier
深入理解Java并发工具包中的CyclicBarrier
|
SQL 分布式计算 DataWorks
DataWorks产品使用合集之支持哪些函数
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
205 1
|
人工智能 自然语言处理 搜索推荐
AIGC在商业银行中的应用现状
【1月更文挑战第11天】AIGC在商业银行中的应用现状
486 3
AIGC在商业银行中的应用现状
|
JSON Kubernetes 数据格式
crictl 常见的命令大全
crictl(Container Runtime Interface Command Line Interface)是一个命令行工具,用于与符合Kubernetes容器运行时接口(CRI)规范的容器运行时进行交互。它提供了一系列命令来查看和管理容器、镜像、Pod等资源。以下是crictl的一些常见命令及其功能概述: ### 1. 镜像管理 * **查看镜像**: - `crictl images`:列出所有镜像。 - `crictl images | grep <image-name>`:查看特定镜像。 * **拉取镜像**: - `crictl pull <image_na
5573 8
|
安全 Java 编译器
单例模式的4种实现方式
单例模式的4种实现方式
306 0
|
算法 数据可视化 定位技术
【用unity实现100个游戏之16】Unity程序化生成随机2D地牢游戏1(附项目源码)
【用unity实现100个游戏之16】Unity程序化生成随机2D地牢游戏1(附项目源码)
416 0