微服务安全(二)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控 ...
随机推荐
- python创建字典多种方式
1.创建空字典 >>> dic = {} >>> type(dic) <type 'dict'> 2.直接赋值创建 >>> dic = ...
- 关于MYSQL5.7:Access denied for user 'root'@'localhost' (using password:YES)解决
这一类解决要提供远程服务,需要进入mysql的my.ini文件中进行修改,但是在win10系统中,my.ini不再放在MYSQL安装目录的根目录中了,需要到一类应用缓存目录中寻找MYSQL的详细配置文 ...
- 使用dom4j工具:XMLWriter写出文件(五)
package dom4j_write; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStre ...
- el-upload上传文件和表单一起提交+后端接收代码
目录 一.前言 二.前端页面展示 三.表单代码 四.Data部分 五.JS方法 六.后端接收方式 七.总结 一.前言 我们在做前端时,会遇到这样的需求,上传Excel文件,并且还要和填写的表单数据,一 ...
- 阿里云服务器,http免费转https详细教程
1.搜ssl证书,点击立即购买 2.这里我们选择免费证书,点击右边立即购买,去支付 购买完成之后,申请证书状态会显示在审核中,不过很快的,几分钟就申请成功了,以下就是我申请成功的界面,因为我服务器用的 ...
- centos7 netstat
netstat 是控制台命令,它可以显示路由表.实际的网络连接以及每一个网络接口设备的状态信息.Netstat 用于显示与 IP . TCP . UDP 和 ICMP 协议相关的统计数据,一般用于检验 ...
- RHCS集群架构之mysql及共享存储iscsi
server1 172.25.7.1(配置Nginx.ricci和luci) server2 172.25.7.2(Apache.iscsi) server3 172.25.7.3(Apache) s ...
- 分布式消息流平台:不要只想着Kafka,还有Pulsar
摘要:Pulsar作为一个云原生的分布式消息流平台,越来越频繁地出现在人们的视野中,大有替代Kafka江湖地位的趋势. 本文分享自华为云社区<MRS Pulsar:下一代分布式消息流平台全新发布 ...
- Raid(0/1/5/10)
一.Raid需要的硬盘数量 1.raid 0: 最少1块硬盘(但是1块盘没有意义,至少2块才有实际意义) 2.raid 1: 最少2块硬盘 3.raid 5: 最少3块硬盘 4 ...
- wireshark 解密加密报文
wireshark 解密IPSec加密后的报文 序言 wireshark作为一款非常优秀的抓包工具,支持了各种各样的网络协议,成为了网络开发中必不可少的工具之一.一般而言,对于普通的网络数据包,wir ...