最近在做关于不同权限用户对接口权限访问的校验程序,包括基于 Bearer token&&Password 的 OAuth2 校验方式以及 基于JWT tokens with Bearer 等校验方式,最近就会发这些校验程序的解析,所以这篇文章先作概念解读引入,以我能理解的说人话方式来解析概念。

本文的前提是对token,session,cookie的作用以及传输方式有一定的理解,当然之后我也会把写好的token,session,cookie的笔记发出来

JWT(json web token)

JWT是对token很多种加密构造的实现 方法/标准 之一

本质: 以json(J)形式的字符串,通过web传播(W)的一种token(T);默认base64算法

用户输入账号密码后,在服务器进行验证,如果无误的话,在服务器生成通过base64编码生成一个JWT Token(字符串),服务器把这个字符串传给客户端存储, 前端在每次请求时将JWT Token放入HTTP请求头中的Authorization属性中

JWT token的组成: base64(头部) + base64(负载) + base64(签名)

签名的构成

头部内指定签名算法(默认HS256) { Base64(头部) + “.” + Base64(负载) , 加密的服务端私钥}

在服务端接收到客户端发送过来的JWT token后的处理流程:

header(头部)和payload(负载)可以直接通过 指定算法+Base64 解码出原文

signature(加密的服务端私钥)无法解码出原文,其作用是校验token有没有被篡改。

服务端获取header中的加密算法之后,
用其加密{Base64(header)+"."+ Base64(payload),加密的已端私钥}
后来和传来的JWT比对校验token是否合格

token每次到服务器验证时,后端会把前两部分和secret再次生成签名,再和第三部分比对,无论改了哪个部分,校验都不会通过

jwt token与session-cookie对比

注意token相比session-cookie方式的优势在于 服务器端不需要存储token

只需在每次 web端请求token 在 服务端解码校验通过后 即时生成token返回供web端下次使用

session-cookie: 每次验证通过给你一份新证明材料(cookie)后自己还要保留一份副本(session)备用核对检查,我有几百万千万用户服务端就要保留几百千万的的副本材料

jwt token: 每次验证通过只需要给你新的一张证明材料,我不用保留什么百万千万材料核对,只需要你提供材料时稍微两个解码算法解码验证就行

OAuth2

OAuth2是一种授权框架,提供了一套详细的授权机制。用户或应用可以通过公开的或私有的设置,授权第三方应用访问特定资源;其使用场景一般为APP或者网页需要账密的授权验证和登录

OAuth2用程序代码实现步骤时,经常会把 JWT 作为一种认证机制使用。所以OAuth2和 JWT 经常一同提及,但这两者实质是不同属性完全不同的东西

OAuth2用在使用第三方账号登录的情况 (比如微博QQ网页或者APP登录)

JWT使用在前后端分离, 需要简单的对后台API进行保护时使用.

因为HTTP协议是开放的,可以任人调用。所以,如果接口不希望被随意调用,就需要做访问权限的控制,对访问用户校验后根据权限等级调用响应API

Bearer Token

Bearer Token验证属于HTTP协议标准验证,它随着OAuth协议而开始流行 官方文档https://tools.ietf.org/html/rfc6750#section-1.2

Bearer验证中的凭证称为BEARER_TOKEN,或者是access_token,它的颁发和验证完全由我们自己的应用程序来控制,而不依赖于系统和Web服务器Bearer认证,其核心便是BEARER_TOKEN,而最通用的Token编码方式便是:JSON WEB TOKEN

拥有 bearer token 的任何一方(被称为 “bearer”),可以以任何方式,来访问受 OAuth 2.0 保护的资源,