前言
你在登录CSDN时,可能会选择微信/QQ/微博等等登录,这时,即使你没有注册过CSDN账号,你同样可以登录。而使用哈喽单车使用支付宝登录也是同样的道理。这时,你已经在使用OAuth2了。
什么是OAuth2
借一下官方定义:
OAuth2.0是一种工业级认证协议。OAuth2.0针对web应用、桌面应用、手机、客厅设备提供特定的授权流程,同时重点关注客户端开发人员的简单性。这个规范及其扩展正在IETF OAuth Working Group中开发。
OAuth2的认证方式
OAuth提供多种认证方式
- 验证码认证模式。这也是前言中给大家说的认证流程使用的方式。
- PKCE。从官方的表述,这个其实是验证码认证方式的一种拓展,提供CSRF攻击防御、验证码注入攻击的防御。
- 客户端认证模式。以客户端的名义申请令牌,而不是资源所有者。
- 设备码认证模式。为非浏览器客户端提供的,通过设备码获取令牌。感兴趣的可以自己去看下官方文档。
- 令牌刷新认证模式。这个是你拿着一个失效的令牌,可以去认证服务器换一个有效的令牌。
- 简化认证模式。就是你不需要再用验证码才能取换令牌了。早前推荐在原生应用和JavaScript应用中使用。但现在这两种应用也推荐使用PKCE了。官方已经不推荐使用该模式了。
- 密码模式。通过用户名密码来换token。这意味着资源所有者的密码会经过客户端。因此,一般情况下,只有公司内部应用才会使用该方式。
以上认证方式,很多时候,大家都只会谈到其中四种:
- 验证码认证模式
- 客户端认证模式
- 简化认证模式
- 密码模式
但大家应当要知道其他三种方式的存在,不然连Spring的几种支持OAuth2的版本的特性都看不懂啊。
Spring OAuth2藩王割据的局面
上面说到Spring对OAuth2的支持,在此,不得不跟大家扯一下,Spring对OAuth2支持的藩王割据的局面。
Spring Security OAuth, Spring Cloud Security, Spring Boot 1.5.x, 以及新的Spring Security 5都提供了对OAuth2的支持。七零八落的。这不,今天想要搭个环境都头疼不已。我是选Spring呢?还是Spring呢?还是Spring呢???
官方也是挺头疼的。于是搞了个计划,在SpringSecurity5中统一对OAuth2的支持,这也是官方标题说的Spring Security 中对下一代OAuth2.0的支持。但是,好死不死,偏偏把认证服务器剥离出来(最开始一度想要放弃支持认证服务器)。重新搞了项目提供认证服务器。
到这里,为了防止有些小迷糊在学习的时候还不知道应该使用哪个,顺便说一下。如果是自己学习新技术,那通过官方的认证服务器项目搭建认证服务器,然后使用SpringSecurity5来构建资源服务器和客户端。
OAuth2的概念
不好意思,各位。上面可能有些概念没将清楚,听得有点懵吧。现在,以验证码模式为例,咱们来捋一捋。
图为OAuth官方的。我们可以看到这里有三个很明显的角色:
- Client客户端
- Resource资源服务器
- AuthorizationServer认证服务器
以通过QQ登录CSDN为例,客户端就是CSDN,而资源服务器和认证服务器都是QQ内部的服务。CSDN请求的是QQ的用户资源,对应的,在QQ内部有个用户资源服务器,还有个认证服务器。一般情况下,尤其是微服务架构,认证服务器和资源服务器通常都是一个公司的。而客户端就是第三方应用。
后记
今天先到这里吧,感觉东西有点的多。下次有时间再来看看新版SpringSecurity5跟认证服务器的组合怎么搭建。