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访问服务器上受保护的资源。
对于OAuth2的使用场景,官方文档都提到针对第三方应用,需要强调的是,这个第三方应用,不要只当作一个完全不相干的应用,这里除了服务本身外的应用,就算第三方应用,即使是你自己的应用,也是第三方应用,不要把第三方应用只当作其他公司开发的应用或系统,如果这样就对OAuth的理解太狭隘了。从广义上讲,你自己开发的客户端也是一种第三方,只是你的客户端是可以输入用户名密码获取令牌的,而真正的第三方是不可以使用用户名和密码获取令牌的(这样暴露用户密码给第三方了),一般是通过审核过后的开发者id来获取令牌的,所以他们在流程上是有很大一部分是相似的。
Oauth2的几种授权模式:
授权码模式(Authorization Code)(正统方式)(支持refresh token)
授权码简化模式(Implicit)(为web浏览器设计)(不支持refresh token)
Pwd模式(Resource Owner Password Credentials) (基本不用)(支持refresh token)
Client模式(Client Credentials) (为后台api调用设计)(不支持refresh token)
扩展模式(Extension)(自定义模式)
Oauth的几个概念:
Roles角色
应用程序或者用户都可以是下边的任何一种角色:
资源拥有者
资源服务器
客户端应用
授权服务器
Client Types客户端类型
这里的客户端主要指API的使用者。它可以是的类型:
私有的
公开的
Client Profile客户端描述
OAuth2框架也指定了集中客户端描述,用来表示应用程序的类型:
Web应用
用户代理
原声应用
Authorization Grants认证授权
认证授权代表资源拥有者授权给客户端应用程序的一组权限,认证授权方式可以是下边几种形式:
授权码
隐式授权
资源拥有者密码证书
客户端证书
Endpoints终端
OAuth2框架需要下边几种终端:
认证终端
Token终端
重定向终端