OAuth2与JWT

前言

什么是Oauth2?

OAuth(Open Authorization,开放授权)是为用户资源的授权定义了一个安全、开放及简单的标准,第三方无需知道用户的账号及密码,就可获取到用户的授权信息。
OAuth2.0是OAuth协议的延续版本,但不向后兼容OAuth 1.0即完全废止了OAuth1.0

注意:对于OAuth2的使用场景,官方文档都提到针对第三方应用,需要强调的是,这个第三方应用,不指的是除了服务本身外的应用,都是第三方应用,即使是自己的应用,也是第三方应用。

了解OAuth2与JWT

  • JWT:JSON Web Token // 是一种具体的Token实现框架;

  • OAuth2:Open Authorization // 是一种授权协议,是规范,不是实现;

  • Spring Security OAuth2:Spring 对 OAuth2 的开源实现,优点是能与Spring Cloud技术栈无缝集成;

  • Spring Security:前身是 Acegi Security ,能够为 Spring企业应用系统提供声明式的安全访问控制;

这里需要理解两个概念:

  • Authentication:用户认证,一般是通过用户名密码来确认用户是否为系统中合法主体;
  • Authorization:用户授权,一般是给系统中合法主体授予相关资源访问权限;

jwt是基于token的认证协议的实现,OAuth2是一种授权框架,提供了一套详细的授权协议标准(指导)。

jwt的基本思路就是用户提供用户名和密码给认证服务器,服务器验证用户提交信息信息的合法性;如果验证成功,会产生并返回一个Token(令牌),用户可以使用这个token访问服务器上受保护的资源。

OAuth

Roles角色

在OAuth2中主要有四个角色,主要如下:

  1. Resource Owner(资源拥有者):用户,即资源的拥有人,想要分享某些资 源给第三方应用
  2. Resource Server(资源服务器):放受保护资源,要访问这些资源,需要获得访问令牌
  3. Authorization server(授权(认证)服务器):授权服务器用于发放访问令牌给客户端
  4. Client(客户端应用(第三方应用)):客户端代表请求资源服务器资源的第三方程序

OAuth2中的其他术语:

  • Client Credentials(客户凭证):客户的clientId 和密码用于认证客户
  • Access Token(访问令牌):授权服务器在接收到客户请求后,颁发的访问令牌
  • Scopes(作用域):客户请求访问令牌时,由资源拥有者额外指定的细分权限(permission)
  • User Agent(用户代理):用户代理。一般就是指浏览器

OAuth2中的令牌类型:

  • Authorization Code Token(授权码):仅用于授权码授权类型,用于交换获取访问令牌和刷新令牌
  • Refresh Token(刷新令牌):用于去授权服务器获取一个新的访问令牌
  • Access Token(访问令牌):用于代表一个用户或服务直接去访问受保护的资源
  • Proof of Possession(PoP) Token(持有证明(pop)令牌):可以校验client是否对Token 有明确的拥有权

授权模式:

  1. 授权码模式(Authorization Code)(正统方式)(支持refresh token)
  2. 授权码简化模式(Implicit)(为web浏览器设计)(不支持refresh token)
  3. Pwd模式(Resource Owner Password Credentials) (基本不用)(支持refresh token)
  4. Client模式(Client Credentials) (为后台api调用设计)(不支持refresh token)
  5. 扩展模式(Extension)(自定义模式)

最常用的grant_type组合有: authorization_code,refresh_token(针对通过浏览器访问的客户端); password,refresh_token(针对移动设备的客户端). implicitclient_credentials在实际中很少使用.

Authorization Grants 认证授权

客户端类型

OAuth 2.0客户端角色被细分为一系列类型和配置,本节将阐述这些类型和配置。

OAuth 2.0规范定义了两种客户端类型:

  • 保密的
  • 公有的

保密的客户端能够对外部保持客户端密码保密。该客户端密码是由授权服务器分配给客户端应用的。为了避免欺骗,该密码是授权服务器用来识别客户端的。例如一个保密的客户端可以是web应用,除了管理员,没有任何人能够访问服务器和看到该密码。

公有的客户端不能使客户端密码保密。比如移动手机应用或桌面应用会将密码嵌入在内部。这样的应用可能被破解,并且泄漏密码。这同于在用户的浏览器上运行的JavaScript应用。用户可以使用一个JavaScript调试器来寻找到应用程序,并查看客户端密码。

客户端配置

OAuth 2.0规范也提到了一系列客户端配置文件。这些配置文件是具体类型的应用程序,这可以是保密或公开的。这些配置文件有:

  • web应用
  • 用户代理
  • 原生

推荐

w3cschool

SpringBoot+Security+JWT基础
SpringBoot+Security+JWT进阶:一、自定义认证
SpringBoot+Security+JWT进阶:二、自定义认证实践

本文地址: https://github.com/maxzhao-it/blog/post/44183/