Oauth2认证的简单介绍
简介
第三方认证技术方案最主要是解决认证协议的通用标准问题,因为要实现跨系统认证,各系统之间要遵循一定的接口协议。
OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。同时,任何第三方都可以使用OAUTH认证服务,任何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。
业界提供了OAUTH的多种实现如PHP、JavaScript、Java,Ruby等各种语言开发包,大大节约了程序员的时间,因而OAUTH是简易的。
互联网很多服务如Open APl,很多大公司如Google, Yahoo, Microsoft等都提供了OAUTH认证服务,这些都足以说明OAUTH标准逐渐成为开放资源授权的标准。
Oauth协议目前发展到2.0版本,1.0版本过于复杂,2.0版本已得到广泛应用。
Oauth 协议:RFC 6749 - The OAuth 2.0 Authorization Framework (ietf.org)
去年面过一家北京公司开发实习岗位,Authing 是什么 | Authing 文档,是个凉面,它好像也是做这个的。
应用场景
下边分析一个Oauth2认证的例子,网站使用微信认证的过程:
- 用户进入网站的登陆界面,点击微信图标以微信账号登陆,该系统,用户是自己在微信里信息的资源拥有者。
点击微信弹出一个二维码,此时用户扫描二维码,开始给网站授权。
- 资源拥有者同意给客户端授权
资源拥有者扫描二维码表示资源拥有者同意给客户端授权,微信会对资源拥有者的身份进行验证,验证通过后,微信会询问用户是否给授权网站访问自己的微信数据,用户点击'确认登录"表示同意授权,微信认证服务器会颁发个授权码,并重定向会网站。
- 客户端获取到授权码,请求认证服务器申请令牌
此过程用户看不到,客户端应用程序请求认证服务器,请求携带授权码。
- 认证服务器向客户端响应令牌
认证服务器验证了客户端请求的授权码,如果合法则给客户端颁发令牌,令牌是客户端访问资源的通行证。此交互过程用户看不到,当客户端拿到令牌后,用户在网站看到已经登录成功,
- 客户端请求资源服务器的资源
客户端携带令牌访问资源服务器的资源。网站携带令牌请求访问微信服务器获取用户的基本信息
- 资源服务器返回受保护资源
资源服务器校验令牌的合法性,如果合法则向用户响应资源信息内容。
注意:资源服务器和认证服务器也可以是统一个服务器,也可以是分开的服务器。如果是分开的服务器通常要求认证服务器来校验令牌的合法性。
角色
客户端
客户端本身不存储任何的资源,需要通过资源拥有者的授权去请求资源服务器的资源,比如:Andriod客户端、IOS客户端、浏览器端、微信客户端。
资源拥有者
通常为用户,也可以是应用程序,既该资源的拥有者。
授权服务器(认证服务器)
用来对资源拥有者的身份进行认证、对访问资源进行授权。客户端要想访问资源需要通过认证服务器由资源拥有者授权后可访问。
常用术语
- 客户凭证 (
client Credentials
): 客户端的ClientID和密码用于认证客户。 - 令牌(
tokens
): 授权服务器在接受到用户的请求后,颁发的访问令牌 - 作用域(
scopes
): 客户请求访问令牌时,由资源拥有者额外制定的细分权限。
常用令牌
- 授权码:仅用于授权码授权类型,用于交换获取访问令牌和刷新令牌
- 访问令牌:用于代表一个用户或服务直接去访问受保护的资源
- 刷新令牌:用于去授权服务器获取一个刷新访问令牌
BearerToken
:不管谁拿到Token都可以访问资源,类似现金Proof of Possession (Pop) Token
:可以校验 client 是否对Token有明确的拥有权
特点
优点
- 更安全,客户端不接触用户密码,服务器端更易集中保护
- 广泛传播并被持续采用
- 短寿命和封装的token
- 资源服务器和授杈服务器解耦
- 集中式授权,简化客户端
- HTTP/JSON友好,易于请求和传递token
- 考虑多种客户端架构场景
- 客户可以具有不同的信任级别
缺点
- 协议框架太竞泛,造成各种实现的兼容性和互操作性差
- 只是一个认证协议,本身并不能告诉你任何用户信息。
授权模式
授权码模式
简化授权码模式
密码模式
客户端模式
刷新令牌
SpringSecurity Oauth2
授权服务器
Authorize Endpoint
:授权端点,进行授权Token Endpoint
:令牌端点,进过授权拿到对应的TokenIntrospection Endpoint
:校验端点,校验Token的合法性Revocat ion Endpoint
:撤销端点,撒销授权
SpringSecurity Oauth2的架构
流程
-
用户访问,此时没有Token。Oauth2RestTemplate会报错,这个报错信息会被Oauth2ClientContextFiter捕获。并重定向到认证服务器
-
认证服务器通过Authorization Endpoint进行授权,并通过AuthorizationServerTokenServices生成授权码并返回给客户端。
-
客户端拿到授权码去认证服务器通过Token Endpoint调用AuthorizationServerTokenServices生成Token并返回给客户端。
SpringBoot整合SpringSecurity Oauth2
实现授权码模式
代码和测试文档
https://github.com/bearbrick0/SpringSecurityOauth2_demo
实现密码模式
代码和测试文档