大话微服务:Spring Cloud gateway+OAuth2 实现单点登录和权限控制(一)OAuth2介绍

前言:

    需求场景:一个平台有多个应用系统组成,登录一次,各个应用系统均能使用,在某一个期间内不需要重复登录。

    技术方案:Oauth2.0是目前最流行的授权机制,经常用来做单点登录,统一认证,用来授权第三方应用,获取用户数据。

即:只需要登录一次,各个系统之间通过令牌来识别。

   本质上:由认证系统产生一个短期的进入令牌(token), 用来代替密码,供第三方应用。

一、相关术语

认证(authentication): 验证用户的身份;
授权(authorization): 验证用户的访问权限。

SSO : 单点登录,是一种解决方案的思想。

JWT: 一种令牌生成技术,同时也是令牌的一个载体。

Spring security: 用于安全的访问,即资源的权限访问控制。

Oauth2: 它本身不是sso,它只是允许用户授权第三方应用访问他在另一个服务器上的资源的一个协议,我们利用这一点可以做单点登录。

OAuth2的术语:

   Authorization server: 认证服务器

   Http service:   HTTP服务提供商

   Resource server: 资源服务器,即服务提供商存用户资源的服务器,它与认证服务器可以是同一台服务器,也可以不同。

   Resource Owner: 资源所有者,本文中又称为用户(User)

    User Agent: 用户代理,更多时候指浏览器。

    Third-part application(即client):  第三方应用程序,又称客户端, 通常是app或者向外提供接口。

二、OAuth2的作用与工作原理

   注:大多情况下,认证服务器和资源服务器在一台机器上,只是逻辑上属于两个概念。

       在客户端(第三方应用程序) 与 HTTP服务提供商之间设置了一个授权层,客户端经认证服务器发给的令牌token(这个令牌是有权限范围和有效期的),去登录授权层, 服务提供商根据令牌的权限范围和有效期,向客户开放相关的资源。   

(A)用户打开客户端以后,客户端要求用户给予授权。

(B)用户同意给予客户端授权。

(C)客户端使用上一步获得的授权,向认证服务器申请令牌。

(D)认证服务器对客户端进行认证以后,确认无误,同意发放令牌。

(E)客户端使用令牌,向资源服务器申请获取资源。

(F)资源服务器确认令牌无误,同意向客户端开放资源。

总结: Oauth2包括授权服务器,资源服务器,客户端(即各个应用系统)这三角色,其实Oauth2只完成认证的工作,至于权限控制还得通过Spring security或者自定义拦截器来做。

三、客户端获得用户授权,才能获得令牌,OAuth2有四种授权方式,即分为四种颁发令牌的方式,从而适用于不同的互联网场景:

(一)密码模式:用户对客户端高度信任时,才会把用户名和密码给客户端,但客户端不存储存密码。

(A)用户向客户端提供用户名和密码。

(B)客户端将用户名和密码发给认证服务器,向后者请求令牌。

(C)认证服务器确认无误后,向客户端提供访问令牌。

http请求包括:grant_type(即它的值是password),username,password,scope(可选,权限的范围)。

(二)授权码模式:最严密的授权模式,通过客户端的后台服务器与服务提供商的认证服务器进行互动。重定向uri及附一个授权码,客户端的后台服务器与认证服务器之间完成的。

(A)用户访问客户端,后者将前者导向认证服务器。

(B)用户选择是否给予客户端授权。

(C)假设用户给予授权,认证服务器将用户导向客户端事先指定的"重定向URI"(redirection URI),同时附上一个授权码。

(D)客户端收到授权码,附上早先的"重定向URI",向认证服务器申请令牌。这一步是在客户端的后台的服务器上完成的,对用户不可见。

(E)认证服务器核对了授权码和重定向URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)。

E步骤中,认证服务器发送的HTTP回复,包含以下参数:

access_token:表示访问令牌,必选项。
token_type:表示令牌类型,该值大小写不敏感,必选项,可以是bearer类型或mac类型。
expires_in:表示过期时间,单位为秒。如果省略该参数,必须其他方式设置过期时间。
refresh_token:表示更新令牌,用来获取下一次的访问令牌,可选项。
scope:表示权限范围,如果与客户端申请的范围一致,此项可省略。

(三)简化模式:

简化模式(implicit grant type)不通过第三方应用程序的服务器,直接在浏览器中向认证服务器申请令牌,跳过了"授权码"这个步骤,因此得名。所有步骤在浏览器中完成,令牌对访问者是可见的,且客户端不需要认证。

(四)客户端模式:

客户端模式(Client Credentials Grant)指客户端以自己的名义,而不是以用户的名义,向"服务提供商"进行认证。严格地说,客户端模式并不属于OAuth框架所要解决的问题。在这种模式中,用户直接向客户端注册,客户端以自己的名义要求"服务提供商"提供服务,其实不存在授权问题。

(A)客户端向认证服务器进行身份认证,并要求一个访问令牌。

(B)认证服务器确认无误后,向客户端提供访问令牌。

 

总结:以上四种OAuth2授权模式,本质上均是从OAuth2服务器上获取access_token,用它来访问资源服务器。

四、OAuth2的应用场景(即需求:

       当我们的程序去访问第三方的服务时,不需要输入用户名和密码,而是有一个经过第三方权威平台(或者自建的认证中心)认证后下发的一个标识用户身份的东西(用户id及用户信息),即叫token,提供给需要访问的应用服务。这样的技术,也同时满足了单点登录,一次登录,可以在各个服务之间自由穿行,当然权限于授权范围内的服务和接口。

       在微服务横行的今天,谁敢说自己手上没几个微服务。微服务减少了服务间的耦合,同时也在某些方面增加了系统的复杂度,比如说用户认证。假设我们这里实现了一个电商平台,用户看到的就是一个 APP 或者一个 web 站点,实际上背后是由多个独立的服务构成的,比如用户服务、订单服务、产品服务等。用户只要第一次输入用户名、密码完成登录后,一段时间内,都可以任意访问各个页面,比如产品列表页面、我的订单页面、我的关注等页面。

       我们可以想象一下,自然能够想到,在请求各个服务、各个接口的时候,一定携带着什么凭证,然后各个服务才知道请求接口的用户是哪个,不然肯定有问题,那其实这里面的凭证简单来说就是一个 Token,标识用户身份的 Token。

五、 令牌与密码的不同:

1.令牌是短期的,到期会自动失效,而密码长期有效。

2.令牌可以被数据所有者撤销,立即失效。密码不允许被他人撤销。

3.令牌有权限范围,例如只读令牌比读写令牌更安全,密码一般是完整权限。

 

六: Spring cloud中Oauth2.0的相关支持

里面最重要的依赖是:spring-security-oauth2-autoconfigure

 <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-oauth2</artifactId>
</dependency>

七、网关与Oauth2.0

   在SpringCloud体系中,我们只对网关层开放外网访问权限,其他后端微服务做网络隔离,所有外部请求必须要通过网关才能访问到后端服务。在网关层对请求进行转发时先校验用户权限,判断用户是否有权限访问。

参考相关网址:

OAuth2.0

《Spring Security对OAuth2的支持》

 

 

 

 

 

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页