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中主要有四个角色,主要如下:
- Resource Owner(资源拥有者):用户,即资源的拥有人,想要分享某些资 源给第三方应用
- Resource Server(资源服务器):放受保护资源,要访问这些资源,需要获得访问令牌
- Authorization server(授权(认证)服务器):授权服务器用于发放访问令牌给客户端
- 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 有明确的拥有权
授权模式:
- 授权码模式(Authorization Code)(正统方式)(支持refresh token)
- 授权码简化模式(Implicit)(为web浏览器设计)(不支持refresh token)
- Pwd模式(Resource Owner Password Credentials) (基本不用)(支持refresh token)
- Client模式(Client Credentials) (为后台api调用设计)(不支持refresh token)
- 扩展模式(Extension)(自定义模式)
最常用的grant_type组合有: authorization_code,refresh_token
(针对通过浏览器访问的客户端); password,refresh_token
(针对移动设备的客户端). implicit
与client_credentials
在实际中很少使用.
Authorization Grants 认证授权
客户端类型
OAuth 2.0客户端角色被细分为一系列类型和配置,本节将阐述这些类型和配置。
OAuth 2.0规范定义了两种客户端类型:
- 保密的
- 公有的
保密的客户端能够对外部保持客户端密码保密。该客户端密码是由授权服务器分配给客户端应用的。为了避免欺骗,该密码是授权服务器用来识别客户端的。例如一个保密的客户端可以是web应用,除了管理员,没有任何人能够访问服务器和看到该密码。
公有的客户端不能使客户端密码保密。比如移动手机应用或桌面应用会将密码嵌入在内部。这样的应用可能被破解,并且泄漏密码。这同于在用户的浏览器上运行的JavaScript应用。用户可以使用一个JavaScript调试器来寻找到应用程序,并查看客户端密码。
客户端配置
OAuth 2.0规范也提到了一系列客户端配置文件。这些配置文件是具体类型的应用程序,这可以是保密或公开的。这些配置文件有:
- web应用
- 用户代理
- 原生
推荐
SpringBoot+Security+JWT基础
SpringBoot+Security+JWT进阶:一、自定义认证
SpringBoot+Security+JWT进阶:二、自定义认证实践