微服务安全(二)OAuth 2.0
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的授权流程如下图所示:

具体步骤如下:
- 用户打开客户端以后,客户端要求用户给予授权;
- 用户同意给予客户端授权;
- 客户端使用上一步获得的授权,向认证服务器申请令牌;
- 认证服务器对客户端进行认证以,确认无误后同意发放令牌;
- 客户端使用令牌,向资源服务器申请获取资源;
- 资源服务器确认令牌无误,同意向客户端开放资源
从OAuth 2.0的授权流程中可以看到基于OAuth 2.0的授权涉及下面4种角色:
- 资源拥有者:资源拥有者是对资源具有授权能力的人,通常也就是我们所说的用户;
- 客户端/第三方应用:客户端/第三方应用代表资源所有者对资源服务器发出访问受保护资源的请求;
- 资源服务器:资源所在的服务器,也就是受安全认证保护的资源;
- 授权服务器:就是通常所说的认证服务器,为客户端应用程序提供不同的访问令牌。授权服务器可以和资源服务器在统一服务器上,也可以独立部署
3. 客户端授权模式
从前面的授权流程中可以看到,客户端必须得到用户的授权,才能从授权服务器中获得访问令牌。在OAuth 2.0中定义了4种客户端授权模式,其中主要用到的三种分别是授权码模式(Authorization Code)、简化模式(Implicit)以及密码模式(Resource OwnerPassword Credentials)。
3.1 授权码模式
授权码模式是OAuth 2.0中功能最完整、流程最严密的授权模式。授权流程如下图所示:

具体步骤如下:
- 用户访问客户端,客户端将用户引导到授权服务器上;
- 用户选择是否同意给客户端授权;
- 如用户同意授权,授权服务器将重定向到客户端事先指定的地址,同时附加上一个授权码(Token);
- 客户端收到授权码后,同时附加上需要重定向的页面(如果有的话),经由客户端后台向授权服务器申请令牌;
- 授权服务器校验授权码后,向客户端发送访问令牌(Access Token)和更新令牌(Refresh Token)并重新定向到上一步指定的页面
3.2 简化模式
简化模式是指不通过客户端的后台服务器来获取访问令牌,这里的客户端通常是浏览器,客户端直接通过脚本语言(如JavaScript)来完成向授权服务器申请访问令牌的操作。
具体步骤如下:
- 用户访问客户端,客户端将用户引导到授权服务器上,并附加认证成功或失败时需要重定向的URI;
- 用户选择是否同意给客户端授权;
- 如用户同意授权,那么授权服务器根据user-agent中的数据进行验证,验证通过后将用户重定向到之前所指定的地址,同时在所重定向的地址中附加一个相应访问令牌的值;
- 浏览器将返回的信息保存在本地,然后向资源服务器发出请求,但不包括访问令牌;
- 资源服务器返回一个网页,通常在该网页中会包含一段代码,该代码可以获取之前返回的访问令牌;
- 浏览器执行上一步中获得的脚本,并获取到访问令牌;
- 浏览器将解析到的访问令牌发送给客户端
3.3 密码模式
密码模式是指客户端通过用户提供的用户名和密码信息,直接通过授权服务器来获取授权。在这种模式下,用户需要把自己的用户名和密码提供给客户端,但是客户端不得储存这些信息。该模式只有在用户对客户端高度信任的情况下或者同一个产品系列中应用。
该模式的授权流程如下:
- 用户向客户端提供相应的用户名和密码;
- 客户端通过用户提供的用户名和密码向授权服务器请求访问令牌;
- 授权服务器确认后,返回访问令牌给客户端
参考资料:
《Spring Cloud微服务架构开发实战》
http://www.ruanyifeng.com/blog/2019/04/oauth_design.html
微服务安全(二)OAuth 2.0的更多相关文章
- Java微服务(二):负载均衡、序列化、熔断
本文接着上一篇写的<Java微服务(二):服务消费者与提供者搭建>,上一篇文章主要讲述了消费者与服务者的搭建与简单的实现.其中重点需要注意配置文件中的几个坑. 本章节介绍一些零散的内容:服 ...
- spring cloud微服务实践二
在上一篇,我们已经搭建了spring cloud微服务中的注册中心.但只有一个注册中心还远远不够. 接下来我们就来尝试提供服务. 注:这一个系列的开发环境版本为 java1.8, spring boo ...
- Re:从0开始的微服务架构--(二)快速快速体验微服务架构?--转
原文地址:https://mp.weixin.qq.com/s/QO1QDQWnjHZp8EvGDrxZvw 这是专题的第二篇文章,看看如何搭建一个简单模式的微服务架构. 记得好久之前看到一个大牛说过 ...
- .NETCore微服务探寻(二) - 认证与授权
前言 一直以来对于.NETCore微服务相关的技术栈都处于一个浅尝辄止的了解阶段,在现实工作中也对于微服务也一直没有使用的业务环境,所以一直也没有整合过一个完整的基于.NETCore技术栈的微服务项目 ...
- Spring Cloud(6):保护微服务(Security) - OAuth2.0
OAuth2是一个授权(Authorization)协议.我们要和Spring Security的认证(Authentication)区别开来,认证(Authentication)证明的你是不是这个人 ...
- 微服务入门二:SpringCloud(版本Hoxton SR6)
一.什么是SpringCloud 1.官方定义 1)官方定义:springcloud为开发人员提供了在分布式系统中快速构建一些通用模式的工具(例如配置管理.服务发现.断路器.智能路由.微代理.控制总线 ...
- 微服务学习二:springboot与swagger2的集成
现在测试都提倡自动化测试,那我们作为后台的开发人员,也得进步下啊,以前用postman来测试后台接口,那个麻烦啊,一个字母输错就导致测试失败,现在swagger的出现可谓是拯救了这些开发人员,便捷之处 ...
- 【版本发布】JAVA微服务开发框架,Jeecg-P3 1.0.0 重构版本发布
1.项目介绍 Jeecg-P3是一个微服务框架,采用插件式模式开发:业务插件以JAR方式提供,松耦合可插拔支持独立部署,也可无缝集成Jeecg平台中,目前jeecg已经提供了在线聊天,我的邮箱等一系列 ...
- 后台管理微服务(二)——docker的使用
1. docker概述 1.1 Docker是什么 Docker 是软件工业的集装箱技术 Docker 是一个容器引擎,docker提供了一套完整的容器解决方案. Docker 是一个能将开发的程序自 ...
- Java微服务(二):服务消费者与提供者搭建
本文接着上一篇写的<Java微服务(一):dubbo-admin控制台的使用>,上篇文章介绍了docker,zookeeper环境的安装,并参考dubbo官网演示了dubbo-admin控 ...
随机推荐
- jQuery中的文档操作处理(五):append()、prepend()、after()、before()、wrap()、wrapAll()、wrapInner()、clone()等
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...
- JDBC中级篇——批处理和PreparedStatement对有sql缓冲区的数据库的友好,测试
注意:其中的JdbcUtil是我自定义的连接工具类:代码例子链接: package a_batch; import util.JdbcUtil; import java.sql.Connection; ...
- Mysql的undo、redo、binlog的区别
与不同引擎的关系 核心作用 生命周期 日志类型 undo log 属于innodb引擎独有 回滚,保证事务的"原子性",事务日志 事务开始前,以类似"快照&qu ...
- unity优化 — 纹理(优化)通道分离
unity针对Android平台还提供了通道分离的方式:将图片(sprite)压缩成ETC1,提取Alpha生成一张通道图.unity将通道图保存的格式为a8格式,目的为了让混合起来的Alpha效果很 ...
- 程序解决十苹果问题 Java
程序解决十苹果问题 Java 题目:10个苹果,其中有9个重量相同,剩余1个相比其它重量不同(或重或轻,不得而知),使用天平比较三次,找出重量特殊的那一个 import org.junit.Test; ...
- 磁盘“Seagate”没有被推出,因为一个或多个程序可能正在使用它。
推出移动硬盘失败,解决方案: 执行 lsof /Volumes/Seagate/ 可以看到哪些进程在占用磁盘 $ lsof /Volumes/Seagate/ COMMAND PID USER FD ...
- 性能测试必备命令(1)- free
性能测试必备的 Linux 命令系列,可以看下面链接的文章哦 https://www.cnblogs.com/poloyy/category/1819490.html 介绍 显示系统的内存使用情况 语 ...
- weblogic漏洞分析之CVE-2017-3248 & CVE-2018-2628
CVE-2017-3248 & CVE-2018-2628 后面的漏洞就是2017-3248的绕过而已,所以poc都一样,只是使用的payload不同 本机开启JRMP服务端 ->利用T ...
- XXE从0到1
XXE从0到1 1. XXE概述 XXE(XML External Entity Injection)即XML外部实体注入.漏洞是在对不安全的外部实体数据进行处理时引发的安全问题. 下面我们主要介绍P ...
- 在excel中,应用公式到多行
当一个单元格中输入公式后, 选中单元格 然后将鼠标放到右下角的控制手柄处,当鼠标变成"黑十字"标志 双击鼠标左键 即可