1. 概念

OAuth是一个开放的、安全的用户认证协议,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源,而无须将用户名和登录口令提供给第三方应用。授权的第三方应用只能在特定的时段内访问特定的资源,而非所有内容。每次授权的令牌只能针对一个第三方应用,因此可以认为OAuth是一个非常安全的用户认证/授权协议。

2010年4月OAuth发布了2.0版本,并在2012年10月正式发布为RFC6749。OAuth 2.0对认证流程进行了简化,更加关注客户端开发者的简易性,并为Web应用、桌面应用、手机App等提供专门的认证流程。但OAuth 2.0并不向下兼容OAuth 1.0。基于OAuth 2.0的用户认证具有以下优点。

  • 简单:不管是OAuth 2.0服务的提供商还是应用开发商,都易于理解与使用;
  • 安全:用户认证过程中并不涉及用户密钥等信息,使认证方案更安全、更灵活;
  • 开放:OAuth 2.0只是一个用户认证安全协议,所以任何服务提供商都可以基于该协议来实现,任何软件开发商都可以使用该协议完成用户认证流程

2. 流程

OAuth 2.0的授权流程如下图所示:

具体步骤如下:

  1. 用户打开客户端以后,客户端要求用户给予授权;
  2. 用户同意给予客户端授权;
  3. 客户端使用上一步获得的授权,向认证服务器申请令牌;
  4. 认证服务器对客户端进行认证以,确认无误后同意发放令牌;
  5. 客户端使用令牌,向资源服务器申请获取资源;
  6. 资源服务器确认令牌无误,同意向客户端开放资源

从OAuth 2.0的授权流程中可以看到基于OAuth 2.0的授权涉及下面4种角色:

  • 资源拥有者:资源拥有者是对资源具有授权能力的人,通常也就是我们所说的用户;
  • 客户端/第三方应用:客户端/第三方应用代表资源所有者对资源服务器发出访问受保护资源的请求;
  • 资源服务器:资源所在的服务器,也就是受安全认证保护的资源;
  • 授权服务器:就是通常所说的认证服务器,为客户端应用程序提供不同的访问令牌。授权服务器可以和资源服务器在统一服务器上,也可以独立部署

3. 客户端授权模式

从前面的授权流程中可以看到,客户端必须得到用户的授权,才能从授权服务器中获得访问令牌。在OAuth 2.0中定义了4种客户端授权模式,其中主要用到的三种分别是授权码模式(Authorization Code)、简化模式(Implicit)以及密码模式(Resource OwnerPassword Credentials)。

3.1 授权码模式

授权码模式是OAuth 2.0中功能最完整、流程最严密的授权模式。授权流程如下图所示:

具体步骤如下:

  1. 用户访问客户端,客户端将用户引导到授权服务器上;
  2. 用户选择是否同意给客户端授权;
  3. 如用户同意授权,授权服务器将重定向到客户端事先指定的地址,同时附加上一个授权码(Token);
  4. 客户端收到授权码后,同时附加上需要重定向的页面(如果有的话),经由客户端后台向授权服务器申请令牌;
  5. 授权服务器校验授权码后,向客户端发送访问令牌(Access Token)和更新令牌(Refresh Token)并重新定向到上一步指定的页面

3.2 简化模式

简化模式是指不通过客户端的后台服务器来获取访问令牌,这里的客户端通常是浏览器,客户端直接通过脚本语言(如JavaScript)来完成向授权服务器申请访问令牌的操作。

具体步骤如下:

  1. 用户访问客户端,客户端将用户引导到授权服务器上,并附加认证成功或失败时需要重定向的URI;
  2. 用户选择是否同意给客户端授权;
  3. 如用户同意授权,那么授权服务器根据user-agent中的数据进行验证,验证通过后将用户重定向到之前所指定的地址,同时在所重定向的地址中附加一个相应访问令牌的值;
  4. 浏览器将返回的信息保存在本地,然后向资源服务器发出请求,但不包括访问令牌;
  5. 资源服务器返回一个网页,通常在该网页中会包含一段代码,该代码可以获取之前返回的访问令牌;
  6. 浏览器执行上一步中获得的脚本,并获取到访问令牌;
  7. 浏览器将解析到的访问令牌发送给客户端

3.3 密码模式

密码模式是指客户端通过用户提供的用户名和密码信息,直接通过授权服务器来获取授权。在这种模式下,用户需要把自己的用户名和密码提供给客户端,但是客户端不得储存这些信息。该模式只有在用户对客户端高度信任的情况下或者同一个产品系列中应用。

该模式的授权流程如下:

  1. 用户向客户端提供相应的用户名和密码;
  2. 客户端通过用户提供的用户名和密码向授权服务器请求访问令牌;
  3. 授权服务器确认后,返回访问令牌给客户端

参考资料:

《Spring Cloud微服务架构开发实战》

http://www.ruanyifeng.com/blog/2019/04/oauth_design.html

微服务安全(二)OAuth 2.0的更多相关文章

  1. Java微服务(二):负载均衡、序列化、熔断

    本文接着上一篇写的<Java微服务(二):服务消费者与提供者搭建>,上一篇文章主要讲述了消费者与服务者的搭建与简单的实现.其中重点需要注意配置文件中的几个坑. 本章节介绍一些零散的内容:服 ...

  2. spring cloud微服务实践二

    在上一篇,我们已经搭建了spring cloud微服务中的注册中心.但只有一个注册中心还远远不够. 接下来我们就来尝试提供服务. 注:这一个系列的开发环境版本为 java1.8, spring boo ...

  3. Re:从0开始的微服务架构--(二)快速快速体验微服务架构?--转

    原文地址:https://mp.weixin.qq.com/s/QO1QDQWnjHZp8EvGDrxZvw 这是专题的第二篇文章,看看如何搭建一个简单模式的微服务架构. 记得好久之前看到一个大牛说过 ...

  4. .NETCore微服务探寻(二) - 认证与授权

    前言 一直以来对于.NETCore微服务相关的技术栈都处于一个浅尝辄止的了解阶段,在现实工作中也对于微服务也一直没有使用的业务环境,所以一直也没有整合过一个完整的基于.NETCore技术栈的微服务项目 ...

  5. Spring Cloud(6):保护微服务(Security) - OAuth2.0

    OAuth2是一个授权(Authorization)协议.我们要和Spring Security的认证(Authentication)区别开来,认证(Authentication)证明的你是不是这个人 ...

  6. 微服务入门二:SpringCloud(版本Hoxton SR6)

    一.什么是SpringCloud 1.官方定义 1)官方定义:springcloud为开发人员提供了在分布式系统中快速构建一些通用模式的工具(例如配置管理.服务发现.断路器.智能路由.微代理.控制总线 ...

  7. 微服务学习二:springboot与swagger2的集成

    现在测试都提倡自动化测试,那我们作为后台的开发人员,也得进步下啊,以前用postman来测试后台接口,那个麻烦啊,一个字母输错就导致测试失败,现在swagger的出现可谓是拯救了这些开发人员,便捷之处 ...

  8. 【版本发布】JAVA微服务开发框架,Jeecg-P3 1.0.0 重构版本发布

    1.项目介绍 Jeecg-P3是一个微服务框架,采用插件式模式开发:业务插件以JAR方式提供,松耦合可插拔支持独立部署,也可无缝集成Jeecg平台中,目前jeecg已经提供了在线聊天,我的邮箱等一系列 ...

  9. 后台管理微服务(二)——docker的使用

    1. docker概述 1.1 Docker是什么 Docker 是软件工业的集装箱技术 Docker 是一个容器引擎,docker提供了一套完整的容器解决方案. Docker 是一个能将开发的程序自 ...

  10. Java微服务(二):服务消费者与提供者搭建

    本文接着上一篇写的<Java微服务(一):dubbo-admin控制台的使用>,上篇文章介绍了docker,zookeeper环境的安装,并参考dubbo官网演示了dubbo-admin控 ...

随机推荐

  1. Java程序设计学习笔记(一)

    时间:2015-6-2 23:04 程序员,程序猿,程序媛,码农 -------------------------------------------------------   --Java的应用 ...

  2. 老鼠走迷宫II

    转自:http://blog.csdn.net/holymaple/article/details/8636234 由于迷宫的设计,老鼠走迷宫的入口至出口路径可能不止一条,如何求出所有的路径呢? 解法 ...

  3. 工具库用久了,你还会原生操作 Cookie 吗?

    用得好了,工具库和框架确实是一大助力,但就怕我们会因此习惯了走捷径,而忘了自己的根本依靠是什么. 前言 前端技术的飞速发展,给从业人员不可避免地带来了"疲劳"感,我们常常会感叹学不 ...

  4. 多线程-synchorized

    synchorized锁升级过程: synchorized锁升级过程中只能升级不能降级,起初是JDK早期(1.5之前),是重量级锁,是找操作系统申请OS锁.所谓重量级锁是说获取锁和释放锁都需要经过操作 ...

  5. nginx 开启,关闭,重启

    2021-08-191. 启动 # 判断配置文件是否正确 cd /usr/local/nginx/sbin ./nginx -t # 启动 cd usr/local/nginx/sbin ./ngin ...

  6. centos7 shell 计算器 bc 命令

    2021-08-03 1. 安装 yum -y install bc 2. 简介 bc 命令是任意精度计算器语言,通常在 linux 下当计算器使用 类似基本的计算器, 使用这个计算器可以做基本的数学 ...

  7. springmvc图片上传、json

    springmvc的图片上传 1.导入相应的pom依赖 <dependency> <groupId>commons-fileupload</groupId> < ...

  8. shell逐行读取文件内容

    shell 中逐行读取文件内容 1.语法简介 #!/bin/bash <<EOF shell 中逐行读取文件内容的语法如下所示. 这里虽然很简单,但是再配合上其他的工具,如sed,awk, ...

  9. 导出excel、word、csv文件方法汇总

    http://www.woaic.com/2012/06/64 excel文件主要是输出html代码.以xls的文本格式保存文件. 生成excel格式的代码: /// <summary> ...

  10. 使用git克隆仓库到本地报错:SSL certificate problem: unable to get local issuer certificate

    第一次使用Git工具克隆仓库,使用的是HTTPS链接,失败了.发现是因为通过HTTPS访问时,如果服务器上的SSL证书未经过第三方机构认证,Git就会报错. 解决方法:通过命令关闭验证 git con ...