OAuth2是一个授权(Authorization)协议。我们要和Spring Security的认证(Authentication)区别开来,认证(Authentication)证明的你是不是这个人,而授权(Authorization)则是证明这个人有没有访问这个资源(Resource)的权限。
下面这张图来源于OAuth 2.0 authorization framework RFC Document,是OAuth2的一个抽象流程。

  1. +--------+ +---------------+
  2. | |--(A)- Authorization Request ->| Resource |
  3. | | | Owner |
  4. | |<-(B)-- Authorization Grant ---| |
  5. | | +---------------+
  6. | |
  7. | | +---------------+
  8. | |--(C)-- Authorization Grant -->| Authorization |
  9. | Client | | Server |
  10. | |<-(D)----- Access Token -------| |
  11. | | +---------------+
  12. | |
  13. | | +---------------+
  14. | |--(E)----- Access Token ------>| Resource |
  15. | | | Server |
  16. | |<-(F)--- Protected Resource ---| |
  17. +--------+ +---------------+

先来解释一下上图的名词:

  Resource Owner:资源所有者,即用户

  Client:客户端应用程序(Application)

  Authorization Server:授权服务器

  Resource Server:资源服务器

再来解释一下上图的大致流程:

(A) 用户连接客户端应用程序以后,客户端应用程序要求用户给予授权

(B) 用户同意给予客户端应用程序授权

(C) 客户端应用程序使用上一步获得的授权(Grant),向授权服务器申请令牌

(D) 授权服务器对客户端应用程序的授权(Grant)进行验证后,确认无误,发放令牌

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

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

从上面的流程可以看出,如何获取授权(Grant)才是关键。在OAuth2中有4种授权类型:

1. Authorization Code(授权码模式):功能最完整、流程最严密的授权模式。通过第三方应用程序服务器与认证服务器进行互动。广泛用于各种第三方认证。

2. Implicit(简化模式):不通过第三方应用程序服务器,直接在浏览器中向认证服务器申请令牌,更加适用于移动端的App及没有服务器端的第三方单页面应用。

3. Resource Owner Password(密码模式):用户向客户端服务器提供自己的用户名和密码,用户对客户端高度信任的情况下使用,比如公司、组织的内部系统,SSO。

4. Client Credentials(客户端模式):客户端服务器以自己的名义,而不是以用户的名义,向认证服务器进行认证。

下面主要讲最常用的(1)和(3)。此外,还有一个模式叫Refresh Token,也会在下面介绍。

Authorization Code(授权码模式)

  1. +----------+
  2. | Resource |
  3. | Owner |
  4. | |
  5. +----------+
  6. ^
  7. |
  8. (B)
  9. +----|-----+ Client Identifier +---------------+
  10. | -+----(A)-- & Redirection URI ---->| |
  11. | User- | | Authorization |
  12. | Agent -+----(B)-- User authenticates --->| Server |
  13. | | | |
  14. | -+----(C)-- Authorization Code ---<| |
  15. +-|----|---+ +---------------+
  16. | | ^ v
  17. (A) (C) | |
  18. | | | |
  19. ^ v | |
  20. +---------+ | |
  21. | |>---(D)-- Authorization Code ---------' |
  22. | Client | & Redirection URI |
  23. | | |
  24. | |<---(E)----- Access Token -------------------'
  25. +---------+ (w/ Optional Refresh Token)
  26.  
  27. Note: The lines illustrating steps (A), (B), and (C) are broken into
  28. two parts as they pass through the user-agent.

它的步骤如下:

(A) 用户(Resource Owner)通过用户代理(User-Agent)访问客户端(Client),客户端索要授权,并将用户导向认证服务器(Authorization Server)。

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

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

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

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

Resource Owner Password(密码模式)

  1. +----------+
  2. | Resource |
  3. | Owner |
  4. | |
  5. +----------+
  6. v
  7. | Resource Owner
  8. (A) Password Credentials
  9. |
  10. v
  11. +---------+ +---------------+
  12. | |>--(B)---- Resource Owner ------->| |
  13. | | Password Credentials | Authorization |
  14. | Client | | Server |
  15. | |<--(C)---- Access Token ---------<| |
  16. | | (w/ Optional Refresh Token) | |
  17. +---------+ +---------------+
  18.  
  19. Figure 5: Resource Owner Password Credentials Flow

它的步骤如下:

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

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

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

令牌刷新(refresh token)

  1. +--------+ +---------------+
  2. | |--(A)------- Authorization Grant --------->| |
  3. | | | |
  4. | |<-(B)----------- Access Token -------------| |
  5. | | & Refresh Token | |
  6. | | | |
  7. | | +----------+ | |
  8. | |--(C)---- Access Token ---->| | | |
  9. | | | | | |
  10. | |<-(D)- Protected Resource --| Resource | | Authorization |
  11. | Client | | Server | | Server |
  12. | |--(E)---- Access Token ---->| | | |
  13. | | | | | |
  14. | |<-(F)- Invalid Token Error -| | | |
  15. | | +----------+ | |
  16. | | | |
  17. | |--(G)----------- Refresh Token ----------->| |
  18. | | | |
  19. | |<-(H)----------- Access Token -------------| |
  20. +--------+ & Optional Refresh Token +---------------+

具体流程不再分析,我们已知,当我们申请token后,Authorization Server不仅给了我们Access Token,还有Refresh Token。当Access Token过期后,我们用Refresh Token访问/refresh端点就可以拿到新的Access Token了。

本节只讲概念,在接下来的几节中会搭建一组含有Client Application, Authorization Server, Resource Server的微服务群,并使用Eureka和Config组件管理。

Spring Cloud(6):保护微服务(Security) - OAuth2.0的更多相关文章

  1. 《Spring Cloud与Docker微服务架构实战》配套代码

    不才写了本使用Spring Cloud玩转微服务架构的书,书名是<Spring Cloud与Docker微服务架构实战> - 周立,已于2017-01-12交稿.不少朋友想先看看源码,现将 ...

  2. Spring Cloud与Docker微服务架构实战 PDF

    电子版百度云下载 链接: https://pan.baidu.com/s/115u011CJ8MZzJx_NqutyTQ 提取码: 关注公众号[GitHubCN]回复2019获取 本书的代码 共计70 ...

  3. Spring Cloud与Docker微服务架构实战 PDF版 内含目录

    Spring Cloud与Docker微服务架构实战  目录 1 微服务架构概述 1 1.1 单体应用架构存在的问题1 1.2 如何解决单体应用架构存在的问题3 1.3 什么是微服务3 1.4 微服务 ...

  4. Spring Cloud与Docker——微服务架构概述

    Spring Cloud与Docker--微服务架构概述 单体应用架构概述 微服务概述 微服务的特性 微服务架构的优点 微服务面临的挑战 微服务的设计原则 单体应用架构概述 传统的服务发布都是采用单体 ...

  5. spring cloud + mybatis 分布式 微服务 b2b2c 多商户商城 全球部署方案

    用java实施的电子商务平台太少了,使用spring cloud技术构建的b2b2c电子商务平台更少,大型企业分布式互联网电子商务平台,推出PC+微信+APP+云服务的云商平台系统,其中包括B2B.B ...

  6. 从 Spring Cloud 看一个微服务框架的「五脏六腑」

    原文:https://webfe.kujiale.com/spring-could-heart/ Spring Cloud 是一个基于 Spring Boot 实现的微服务框架,它包含了实现微服务架构 ...

  7. 从 Spring Cloud 看一个微服务框架的「五脏六腑」(转)

    Spring Cloud 是一个基于 Spring Boot 实现的微服务框架,它包含了实现微服务架构所需的各种组件. 本文将从 Spring Cloud 出发,分两小节讲述微服务框架的「五脏六腑」: ...

  8. 基于 Spring Cloud 完整的微服务架构实战

    本项目是一个基于 Spring Boot.Spring Cloud.Spring Oauth2 和 Spring Cloud Netflix 等框架构建的微服务项目. @作者:Sheldon地址:ht ...

  9. Spring Cloud Alibaba 新一代微服务解决方案

    本篇是「跟我学 Spring Cloud Alibaba」系列的第一篇, 每期文章会在公众号「架构进化论」进行首发更新,欢迎关注. 1.Spring Cloud Alibaba 是什么 Spring ...

  10. 综合使用spring cloud技术实现微服务应用

    在之前的章节,我们已经实现了配置服务器.注册服务器.微服务服务端,实现了服务注册与发现.这一章将实现微服务的客户端,以及联调.实现整个spring cloud框架核心应用. 本文属于<7天学会s ...

随机推荐

  1. WCF Endpoint分类

    WCF中可以为一个Service配置多个Endpoint 这些Endpoint的分类方法有下面3中 1.全局就一个endpoint,一个接口公开所有的方法,这适合简单的业务场景 2.将endpoint ...

  2. CSRF(cross-site request forgery )跨站请求攻击

    CSRF(cross-site request forgery )跨站请求伪造,攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,通过 ...

  3. 前端知识体系:JavaScript基础-原型和原型链-理解 es6 中class构造以及继承的底层实现原理

    理解 es6 中class构造以及继承的底层实现原理 原文链接:https://blog.csdn.net/qq_34149805/article/details/86105123 1.ES6 cla ...

  4. c++ string类基本使用

    初始化用法 #include <iostream> #include "string" using namespace std; void main() { strin ...

  5. 用Qt 画一个心形

    MainWindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QTi ...

  6. python自动华 (五)

    Python自动化 [第五篇]:Python基础-常用模块 目录 模块介绍 time和datetime模块 random os sys shutil json和pickle shelve xml处理 ...

  7. Python 13--数据库

  8. python 赋值魔法

    序列解包: >>> x,y,z = 1, 2, 3>>> print(x, y, z)1 2 3 >>> a,b, *reset = [1,2,3 ...

  9. UDP c/s 模型

    server.c /* udp server.c */ #include <string.h> #include <netinet/in.h> #include <std ...

  10. [Luogu] 跑路

    https://www.luogu.org/problemnew/show/P1613 Floyd判断是否一步到达 将一步到达的连变跑Floyd #include <iostream> # ...