微服务统一认证方案Spring Cloud OAuth2+JWT


前言

首先我们来明确一下什么叫"认证"

        "认证"就是验证用户的合法身份,比如输入用户名和密码,系统会在后台验证用户名和密码的正确性,通过后才能够进行后续操作,访问受保护的资源。


一、微服务架构下的统一认证场景

        分布式系统下面由一系列微服务构成,每个微服务都提供着用户所需要的资源,而这些资源都是受保护的,也就是说每一个微服务都会有认证需求。

        如果我们在每一个服务中都实现一套认证逻辑的话代码就会非常冗余,而且访问不同的服务都需要重复登录验证这样很不友好,这时候就需要统一认证。

        考虑分布式系统共享性的特点,可以由一个独立的认证服务处理系统认证的请求,不同服务间的资源调用只需要一次认证,就是我们常说的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客户端(对应为第三方应用)

总结

学习使人emo....

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
SpringCloud是一个基于Spring Boot的开源微服务框架。SpringCloud Gateway是SpringCloud生态中的一个组件,提供了一种基于路由的API网关解决方案JWT是JSON WEB Token的缩写,是一种用于身份认证和授权的开放标准。OAuth2是一种授权框架,用于向用户授权第三方应用访问他们的资源。 在微服务架构中,每个服务都是独立的,网关作为服务的入口,可以实现对外的请求过滤和路由。SpringCloud Gateway使用HttpClient进行内部请求的调度和路由。同时,它还提供了一些高阶的路由和过滤功能,如重定向、URL重写、限流、熔断、重试等。 JWT是一种轻量级的认证方案,通过在HTTP请求中添加一个JSON WEB Token,实现对用户进行身份认证和授权。JWT的使用极大地简化了认证过程,前后端可以通过JWT判断用户的身份和权限。 OAuth2为开发者提供了一种授权框架,可以授权第三方应用获取用户访问他们的资源。OAuth2支持多种授权类型,如授权码模式、密码模式、客户端模式和隐式模式。使用OAuth2,可以更好地保护用户的隐私和安全。 综上所述,SpringCloud Gateway、JWTOAuth2都是现代化的解决方案,对于设计和开发微服务架构的应用程序来说,它们都是必不可少的组件。有了它们,开发人员可以更好的搭建分布式架构,确保数据安全性、隐私安全性和服务的可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值