SSO是Single Sign On的缩写,OAuth是Open Authority的缩写,这两者都是使用令牌的方式来代替用户密码访问应用。流程上来说他们非常相似,但概念上又十分不同。
OAuth2.0授权与单点登录的区别【引用自:zifangsky】
根据OAuth2.0授权与单点登录的概念,我们可以得知二者至少存在以下几点区别:
- 从信任角度来看。OAuth2.0授权服务端和第三方客户端不属于一个互相信任的应用群(通常都不是同一个公司提供的服务),第三方客户端的用户不属于OAuth2.0授权服务端的官方用户;而单点登录的服务端和接入的客户端都在一个互相信任的应用群(通常是同一个公司提供的服务),各个子系统的用户属于单点登录服务端的官方用户。
- 从资源角度来看。OAuth2.0授权主要是让用户自行决定——“我”在OAuth2.0服务提供方的个人资源是否允许第三方应用访问;而单点登录的资源都在客户端这边,单点登录的服务端主要用于登录,以及管理用户在各个子系统的权限信息。
- 从流程角度来看。OAuth2.0授权的时候,第三方客户端需要拿预先“商量”好的密码去获取Access Token;而单点登录则不需要。
- SSO大家应该比较熟悉,它将登录认证和业务系统分离,使用独立的登录中心,实现了在登录中心登录后,所有相关的业务系统都能免登录访问资源。
- OAuth2.0原理可能比较陌生,但平时用的却很多,比如访问某网站想留言又不想注册时使用了微信授权。
以上两者,你在业务系统中都没有账号和密码,账号密码是存放在登录中心或微信服务器中的,这就是所谓的使用令牌代替账号密码访问应用。
SSO
两者有很多相似之处,下面我们来解释一下这个过程。先来讲解SSO,通过SSO对比OAuth2.0,才比较好理解OAuth2.0的原理。SSO的实现有很多框架,比如CAS框架,以下是CAS框架的官方流程图。
下面是zifangsky写的流程图:
上面的流程大概为:
- 用户输入网址进入业务系统Protected App,系统发现用户未登录,将用户重定向到单点登录系统CAS Server,并带上自身地址service参数
- 用户浏览器重定向到单点登录系统,系统检查该用户是否登录,这是SSO(这里是CAS)系统的第一个接口,该接口如果用户未登录,则将用户重定向到登录界面,如果已登录,则设置全局session,并重定向到业务系统
- 用户填写密码后提交登录,注意此时的登录界面是SSO系统提供的,只有SSO系统保存了用户的密码,
- SSO系统验证密码是否正确,若正确则重定向到业务系统,并带上SSO系统的签发的ticket
- 浏览器重定向到业务系统的登录接口,这个登录接口是不需要密码的,而是带上SSO的ticket,业务系统拿着ticket请求SSO系统,获取用户信息。并设置局部session,表示登录成功返回给浏览器sessionId(tomcat中叫JSESSIONID)
- 之后所有的交互用sessionId与业务系统交互即可
OAuth2.0
OAuth2.0有多种模式,这里讲的是OAuth2.0授权码【微信、QQ、微博登录差不多都是这个模式】模式,OAuth2.0的流程跟SSO差不多
- 用户在某网站上点击使用微信授权,这里的某网站就类似业务系统,微信授权服务器就类似单点登录系统
- 之后微信授权服务器返回一个确认授权页面,类似登录界面,这个页面当然是微信的而不是业务系统的
- 用户确认授权,类似填写了账号和密码,提交后微信鉴权并返回一个ticket,并重定向业务系统。
- 业务系统带上ticket访问微信服务器,微信服务器返回正式的token,业务系统就可以使用token获取用户信息了
以上,就是我的SSO和OAuth2.0的理解。
通俗点,讲个故事来分辨下。
举个OAuth2.0的例子:你是租房子住,让后搬家了电视没有搬走。你有空回去搬【需要申请搬电视的权限】,但是来了新租客了【你要登录的APP】。让后你和租客说,你要搬走电视,新租客当然不肯了,如果这个电视不是你的,你搬走了他要赔房东的。他就说,你找房东吧【提交了申请,给你一个跳转的链接】。你就电话房东了,你先和房东说你是谁【房东没有记你的新电话】房东听到你的声音然后描述肯定你是上个租客。然后说,哦哦好的,你自己搬吧【验证身份,让后给你一个授权码】。房东有事情,就挂断了。然后你和租客说你和房东聊好了,可以搬了。租客当然不会这么傻了,你说说好了就说好了,东西丢了不还是他的事情。让后他就给房东打了个电话,说是原来的租客回来搬电视【申请令牌】。房东说对对对,那个是前租客,叫小明。戴眼镜的一个小胖子【获取用户信息】。然后,新租客就允许你搬电视【只允许搬电视,想搬饮水机是不行的,因为刚刚房东给的权限就只有电视的权限】【授权权限】。
举个SSO的例子:今天要到新的城市,有地铁、公交车、渡轮和磁悬浮的各种项目。你想要办张公交卡【就是港剧的八达通】,去了坐公交车【进入业务系统】,公交司机说他这里办不了,你去卡务中心办吧【系统发现用户未登录】。你去了卡务中心,报了下电话号码。然后,用户自己的信息注册了张公交卡【用户填写密码后提交登录,系统签发ticket】。 你就拿公交卡去坐公交车了,让后上车后你刷了下卡,刷卡机获取你的卡号向卡务中心申请了你这次坐车的权限【业务系统拿着ticket请求SSO系统,给业务系统做一个局部的session。*** 刷卡后的使用时间是有限的 ***】。下次坐地铁,你因为已经在卡务中心登记过了,再坐地铁就直接可以坐车了。
参考摘抄链接:
https://www.zifangsky.cn/1258.html#comments
https://www.jianshu.com/p/c1ccb228b75c
http://www.ruanyifeng.com/blog/2019/04/oauth_design.html