目录
前言
一、微服务架构下的统一认证场景
二、微服务架构下的统一认证思路
1.基于Session的认证方式
2.基于token的认证方式(主流)
三、OAuth2开放授权协议/标准
1.OAuth2介绍
2.OAuth2协议角色和流程
3.什么情况下需要使用OAuth2?
4.OAuth2的颁发Token授权方式
四、Spring Cloud OAuth2+JWT实现
1.Spring Cloud OAuth2介绍
2.Spring Cloud OAuth2构建微服务统一认证服务思路
总结
前言
首先我们来明确一下什么叫"认证"
"认证"就是验证用户的合法身份,比如输入用户名和密码,系统会在后台验证用户名和密码的正确性,通过后才能够进行后续操作,访问受保护的资源。
一、微服务架构下的统一认证场景
分布式系统下面由一系列微服务构成,每个微服务都提供着用户所需要的资源,而这些资源都是受保护的,也就是说每一个微服务都会有认证需求。
如果我们在每一个服务中都实现一套认证逻辑的话代码就会非常冗余,而且访问不同的服务都需要重复登录验证这样很不友好,这时候就需要统一认证。
考虑分布式系统共享性的特点,可以由一个独立的认证服务处理系统认证的请求,不同服务间的资源调用只需要一次认证,就是我们常说的sso(单点登录),而分布式环境下的统一认证也是和sso的场景是一样的。
统一认证往往是一种颁发令牌的方式,用户第一次请求过来要求用户到认证服务进行登录验证,认证通过之后会颁发一个令牌,这个令牌就好比一个通行证,每次来请求后台的这些为服务资源的时候都带着这个令牌,然后验证这个令牌是否有效,如果有效就放行。
如下图:
二、微服务架构下的统一认证思路
1.基于Session的认证方式
在分布式的环境下,基于Session的认证会出现一个问题,每一个应用服务都需要再Session中储存用户身份信息,通过负载均衡将本地的请求分配到另一个应用服务需要将Session信息带过去,否则会重新认证。我们是用Session、Session粘贴等方案。
但Session方案也有缺点,在日益复杂的互联网环境和系统架构下是存在一些问题的。
比如使用Session就会涉及到SessionId,而SessionId是储存在Cookie中的,现在的客户端形式都非常丰富,有PC端、移动端等, PC端浏览器对Cookie的支持比较OK,但是移动端对Cookie的支持就不好了,此时就无法再用Session方案来实现统一认证了。
2.基于token的认证方式(主流)
基于token的认证方式,服务端不用存储认证数据,因为登录成功后用户的数据会放到Session中,易维护扩展性强,客户端可以把token存放在任意地方,并且可以实现web和app的统一认证机制。
但是token方式的缺点也很明显,token由于自身包含信息还有一些用户信息,因此一般数据量较大,而且每次请求都会传递token,因此比较占用带宽。另外,token的签名验证操作也会给cpu带来额外的处理负担。
三、OAuth2开放授权协议/标准
1.OAuth2介绍
OAuth(开放授权)是一个开放协议/标准,允许用户授权第三方应用访问他们储存在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方应用或分享他们数据的所有内容。
结合"使用QQ登录拉钩"这一场景拆分理解这句话就是:
用户:我们自己
第三方应用:拉勾网
另外的服务提供者:QQ
OAuth2是OAuth协议的延续版本,但不向后兼容OAuth1,即完全废止了OAuth1。
2.OAuth2协议角色和流程
XX网站如果要开发QQ登录这个功能的话,那么XX网是需要提前到QQ平台登记的。
1)XX网登记到---->QQ平台
2)QQ平台会颁发一些参数给XX网,后续上线进行授权登录的时候(弹出的QQ登录的授权页面)需要携带这些参数
client_id:客户端id(QQ最终相当于一个认证授权服务器,XX网就相当于一个客户端,所以会给一个客户端id),相当于账号。
secret:相当于密码。
资源拥有者(Resource Owner):可以理解为用户自己
客户端(Client):我们想登录的XX网站或应用
认证服务器(Authorization Server):可以理解为微信或者QQ
资源服务器(Resource Server):可以理解为微信或者QQ
3.什么情况下需要使用OAuth2?
第三方授权登录的场景:比如我们经常登录一些网站或者应用的时候,可以选择使用第三方授权登录的方式,比如:微信授权登录、QQ授权登录等,这是典型的OAuth2的使用场景。
单点登录的场景:如果项目中有很多的微服务或者公司内部有很多服务,可以专门做一个认证中心(充当认证平台角色),所有的服务都要到这个认证中心做认证,只做一次登录,就可以在多个授权范围内的服务中自由串行。
4.OAuth2的颁发Token授权方式
1)授权码(authorization code)
2)密码式(password)
3)隐藏式(implicit)
4.客户端凭证(client credentials)
授权码模式使用到了回调地址,是最复杂的授权方式,微博、微信、QQ等第三方登录就是这种模式。我们重点来了解接口对接中常用的password密码模式(提供用户名+密码换取token)。
四、Spring Cloud OAuth2+JWT实现
1.Spring Cloud OAuth2介绍
Spring Cloud OAuth2是Spring Cloud体系对OAuth2协议的实现,可以用来做多个微服务的统一认证(验证身份合法性)授权(验证权限)。通过向OAuth2服务(统一认证授权服务)发送某个类型的grant_type进行集中认证和授权,从而获得access_token(访问令牌),而这个token是受其他微服务信任的。
注意:使用OAuth2解决问题的本质是,引入了一个认证授权层,认证授权层连接了资源的拥有者,在授权层里面,资源的拥有者可以给第三方应用授权去访问我们的某些受保护资源。
2.Spring Cloud OAuth2构建微服务统一认证服务思路
注意:在我们统一认证的场景中,Resoure Server其实就是我们的各种受保护的微服务,微服务中的各种API访问接口就是资源,发起http请求的浏览器就是Client客户端(对应为第三方应用)文章来源:https://www.toymoban.com/news/detail-408991.html
总结
学习使人emo....文章来源地址https://www.toymoban.com/news/detail-408991.html
到了这里,关于微服务统一认证方案Spring Cloud OAuth2+JWT的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!