Spring Security 实战干货: 简单的认识 OAuth2.0 协议

1.前言
欢迎阅读 Spring Security 实战干货 系列文章 。OAuth2.0 是近几年比较流行的授权机制,对于普通用户来说可能每天你都在用它,我们经常使用的第三方登录大都基于 OAuth2.0。随着应用的互联互通,个性化服务之间的相互调用,开放性的认证授权成为 客观的需要。
2. OAuth2.0 的简单认识
OAuth定义了如下角色,并明确区分了它们各自的关注点,以确保快速构建一致性的授权服务:
- Resource Owner 资源拥有者,通常指的是终端用户,其作用是同意或者拒绝、甚至是选择性的给第三方应用程序的授权请求。
- User Agent 用户代理 指的的资源拥有者授权的一些渠道。一般指的是浏览器、APP
- Client 请求授权和请求访问受限资源的客户端程序。
- Authorization Server 对用户授权进行鉴别并根据鉴别结果进行同意或拒绝的授权响应的服务器。
- Resource Server 能够接受和响应受保护资源请求的服务器。
单纯的文字性描述是不是有些难以理解。所以我这里讲一个亲身经历的事例来情景化以上的四个概念。马上又到程序员集中面试的季节了,有一年我去面试,到了地方才发现如此的“高大上”,访客需要通过验证码才能通过闸门,于是我联系了面试公司的HR ,后面的流程大概是这样的:
- 我向面试公司(HR)发送了一个进门的要求。
- HR 给了我一个可以获取进门许可请求的链接。
- 我通过链接进行进门许可请求。
- 请求得到响应,返给我一个验证码。
- 我在闸门程序中输入验证码。
- 验证通过后放行。
在我学习了 OAuth2.0 协议之后我发现这次经历可以体现出 OAuth2.0 的一些设计理念。访客必须通过授权才能访问大楼。这种方式避免了闲杂人等出入办公场所,而且对访客可控(从访问时间和次数上),甚至可以实现对楼层的访问可控(当然上面的例子中没有)。
再结合 OAuth2.0 可以知道 访客就是 Client,公司(业主)就是 Resource Owner,物业就是 Authorization Server ,那个闸机就是 Resource Server,闸机有可能也受到物业的管控。 这是那张著名的流程图:

这个例子只是为了快速的来认识 OAuth2.0 ,它是一种有效的、可靠的委托授权框架。它提供了多种授权模式在不同的场景下供你选择。
3. 授权模式
为了获得访问许可,客户端需要向授权服务器出示有效的授权凭证,也就是说客户端必须得到用户授权(authorization grant)OAuth2.0 提供了多种授权模式供开发者在不同的场景中使用,以下是授权模式的一些总结:
| 授权方式 | 客户端类型/用例 |
|---|---|
| Authorization code | 旨在用于具有后端的传统Web应用程序以及本机(移动或桌面)应用程序,以利用通过系统浏览器的单点登录功能。 |
| Implicit | 适用于不带后端的基于浏览器的(JavaScript)应用程序。 |
| Password | 对于应用程序和授权服务器属于同一提供程序的受信任本机客户端。 |
| Client credentials | 客户端以自己的名义来获取许可,而不是以终端用户名义,或者可以说该用户端也是资源拥有者 |
| Refresh token | 令牌失效后使客户端可以刷新其访问令牌,而不必再次执行代码或 密码授予的步骤。 |
| SAML 2.0 bearer | 使拥有SAML 2.0断言(登录令牌)的客户端将其交换为OAuth 2.0访问令牌。 |
| JWT bearer | 拥有一个安全域中的JSON Web令牌断言的客户端将其交换为另一域中的OAuth 2.0访问令牌。 |
| Device code | 设备的唯一编码,一般该编码不可更改,多用于一些智能设备 |
| Token exchange | 使用代理模拟的方式获取令牌 |
其中前五种为我们所熟知。我们后续会详细介绍它们。
4. OAuth 2.0 的一些要点
摘自《OAuth 2 实战》:
由于 OAuth2.0 被定义为一个框架,对于 OAuth2.0 是什么和不是什么,一直未明确。我们所说的 OAuth2.0 是指 OAuth2.0 核心规范中定义的协议,RFC 6749 核心规范详述了一系列获取访问令牌的方法;还包括其伴随规范中定义的 bearer 令牌,RFC 6750该规范规定了这种令牌的用法。获取令牌和使用令牌这两个环节是 OAuth2.0 的基本要素。正如我们将在本节中看到的,在更广泛的 OAuth2.0 生态系统中存在很多其他技术,它们配合 OAuth2.0 核心,提供更多 OAuth2.0 本身不能提供的功能。我们认为,这样的生态系统是协议健康发展的体现,但是不应与协议本身混为一谈。
基于以上的原则 OAuth2.0 有以下一些要点需要明确被认识到:
- OAuth2.0 并非身份认证协议,虽然在授权的过程中涉及到身份认证,但是 OAuth2.0 协议本身并不处理用户的信息。客户端访问受保护的资源时并不关心资源的拥有者。
- OAuth2.0 不提供一些消息签名,为了保证安全性所以不应脱离 Https 。在使用其它协议或者系统时也应该明确一个安全机制来承担 Https 所承担的任务。
- OAuth2.0 并没有定义加密方式,虽然目前使用的较多的是 JOSE 规范
- OAuth2.0 虽然令牌被客户端持有并使用,但是客户端并不能解析以及处理令牌。
5. 总结
OAuth2.0 其实还有个特点,它并不是单体协议。它被分成了多个定义和流程,每个定义和流程都有各自的应用场景。所以本文的目的在于场景化的引入 OAuth2.0,当你渐入佳境时,我们再来进行细节的探讨吧。如果你想知道更多关于 OAuth2.0 协议的相关知识,可关注公众号:Felordcn 回复 oauth 获取相关知识的资料。
Spring Security 实战干货: 简单的认识 OAuth2.0 协议的更多相关文章
- Spring Security 实战干货:客户端OAuth2授权请求的入口
1. 前言 在Spring Security 实战干货:OAuth2第三方授权初体验一文中我先对OAuth2.0涉及的一些常用概念进行介绍,然后直接通过一个DEMO来让大家切身感受了OAuth2.0第 ...
- Spring Security 实战干货:OAuth2授权请求是如何构建并执行的
在Spring Security 实战干货:客户端OAuth2授权请求的入口中我们找到了拦截OAuth2授权请求入口/oauth2/authorization的过滤器OAuth2Authorizati ...
- Spring Security 实战干货:OAuth2登录获取Token的核心逻辑
1. 前言 在上一篇Spring Security 实战干货:OAuth2授权回调的核心认证流程中,我们讲了当第三方同意授权后会调用redirectUri发送回执给我们的服务器.我们的服务器拿到一个中 ...
- Spring Security 实战干货:OAuth2第三方授权初体验
1. 前言 Spring Security实战干货系列 现在很多项目都有第三方登录或者第三方授权的需求,而最成熟的方案就是OAuth2.0授权协议.Spring Security也整合了OAuth2. ...
- Spring Security 实战干货:使用 JWT 认证访问接口
(转载)原文链接:https://my.oschina.net/10000000000/blog/3127268 1. 前言 欢迎阅读Spring Security 实战干货系列.之前我讲解了如何编写 ...
- Spring Security 实战干货:图解Spring Security中的Servlet过滤器体系
1. 前言 我在Spring Security 实战干货:内置 Filter 全解析对Spring Security的内置过滤器进行了罗列,但是Spring Security真正的过滤器体系才是我们了 ...
- Spring Security 实战干货:图解用户是如何登录的
1. 前言 欢迎阅读Spring Security 实战干货系列文章,在集成Spring Security安全框架的时候我们最先处理的可能就是根据我们项目的实际需要来定制注册登录了,尤其是Http登录 ...
- Spring Security 实战干货:实现自定义退出登录
文章目录 1. 前言 2. 我们使用 Spring Security 登录后都做了什么 2. 退出登录需要我们做什么 3. Spring Security 中的退出登录 3.1 LogoutFilte ...
- Spring Security 实战干货:如何实现不同的接口不同的安全策略
1. 前言 欢迎阅读 Spring Security 实战干货 系列文章 .最近有开发小伙伴提了一个有趣的问题.他正在做一个项目,涉及两种风格,一种是给小程序出接口,安全上使用无状态的JWT Toke ...
随机推荐
- laravel 定时任务通过队列发送邮件
https://www.jianshu.com/p/f6b94596098e 关于laravel发送邮件,请先参考我的另一片文章:laravel sendcloud发送邮件,再继续往下看. 1.用da ...
- react组件之间的参数传递
1.父组件向子组件传递参数 class Child extends Component { componentDidMount(){ let name = this.props.default; co ...
- SuperSocket特点
² 简单易用,只需要几个类就能创建出健壮的Socket服务器端程序 ² 性能优良, 稳定可靠 ² 支持各种协议, 内置的协议解析工具让你把实现通信协议这种复杂的工作变得很简单 ² 自动支持SS ...
- ccf-201703-4-地铁修建
二分+并查集 发现了一个很奇怪的问题,二分的上界设置错了,结果是运行错误...只有95分.后来改了上界就100了,百思不得其解 #include<cstdio> #include<c ...
- Spring Boot 集成日志logback + 控制台打印SQL
一: 控制台打印SQL application.properties中添加如下即可在控制台打印sql logging.level.com.fx.fxxt.mapper=debug 二:日志 因为Spr ...
- jquery实用应用之jquery操作radio、checkbox、select
本文收集一些jquery的实用技巧,非常实用的哦,其中对radio.checkbox.select选中与取值的方法. 获取一组radio被选中项的值var item = $('input[@name= ...
- codeforces1217-edu
C The Number Of Good Substrings 我原来的基本思路也是这样,但是写的不够好 注意算前缀和的时候,字符串起始最好从1开始. #include<cstdio> # ...
- Date和Calendar
处理日期,时间: 大部分的方法已过时,不推荐使用,但是你使用过时的方法也不会报错. Date() 分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒). Date(long date) ...
- 关于Ping和Tracert命令原理详解
本文只是总结了两个常用的网络命令的实现原理和一点使用经验说明.这些东西通常都分布在各种书籍或者文章中的,我勤快那么一点点,总结一下,再加上我的一点理解和使用经验,方便大家了解.这些也是很基础的东西,没 ...
- Spring Boot 2.x使用Mockito进行测试
在上一篇,项目基本实现了Spring Boot对Mybatis的整合.这篇文章使用Mockito对项目进行测试. 1.使用postmat测试: 2.编写单元测试类,使用mockito进行测试: 3.使 ...