JWT是一种认证协议
JWT提供了一种用于发布接入令牌(Access Token),并对发布的签名接入令牌进行验证的方法。令牌(Token)本身包含了一系列声明,应用程序可以根据这些声明限制用户对资源的访问。
OAuth2是一种授权框架
另一方面,OAuth2是一种授权框架,提供了一套详细的授权机制(指导)。用户或应用可以通过公开的或私有的设置,授权第三方应用访问特定资源
JWT是一种安全标准。基本思路就是用户提供用户名和密码给认证服务器,服务器验证用户提交信息的合法性;如果验证成功,会产生并返回一个Token(令牌),用户可以使用这个token访问服务器上受保护的资源。
token的例子:[所有部分都 base64 URL-safe进行编码处理]
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
一个token包含三部分:
header.claims.signature
Header头部分---------->头部分简单声明了类型(JWT)以及产生签名所使用的算法。
{
"alg" : "AES256",
"typ" : "JWT"
}
Claims声明------------>声明部分是整个token的核心,表示要发送的用户详细信息。有些情况下,我们很可能要在一个服务器上实现认证,然后访问另一台服务器上的资源;或者,通过单独的接口来生成token,token被保存在应用程序客户端(比如浏览器)使用。
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
Signature签名------------------>签名的目的是为了保证上边两部分信息不被篡改。如果尝试使用Bas64对解码后的token进行修改,签名信息就会失效。一般使用一个私钥(private key)通过特定算法对Header和Claims进行混淆产生签名信息,所以只有原始的token才能于签名信息匹配。
这里有一个重要的实现细节。只有获取了私钥的应用程序(比如服务器端应用)才能完全认证token包含声明信息的合法性。所以,永远不要把私钥信息放在客户端(比如浏览器)
==============================
OAuth2
OAuth2不是一个标准协议,而是一个安全的授权框架。它详细描述了系统中不同角色、用户、服务前端应用(比如API),以及客户端(比如网站或移动App)之间怎么实现相互认证。
Roles角色
应用程序或者用户都可以是下边的任何一种角色:
- 资源拥有者
- 资源服务器
- 客户端应用
- 认证服务器
Client Types客户端类型
这里的客户端主要指API的使用者。它可以是的类型:
- 私有的
- 公开的
Client Profile客户端描述
OAuth2框架也指定了集中客户端描述,用来表示应用程序的类型:
- Web应用
- 用户代理
- 原声应用
Authorization Grants认证授权
认证授权代表资源拥有者授权给客户端应用程序的一组权限,可以是下边几种形式:
- 授权码
- 隐式授权
- 资源拥有者密码证书
- 客户端证书
- Endpoints终端
OAuth2框架需要下边几种终端:
- 认证终端
- Token终端
- 重定向终端