跨域认证

由于HTTP是无状态的,在浏览器和HTTP服务器之间通信时可通过来识别身份,但对于桌面应用程序,则无法实现 。因此诞生了HTTP基本认证(Basic ) 。桌面应用通常会将“用户名:密码”使用算法编码后的字符串放到HTTP请求头的字段中发送给服务端 。
Authorization: Basic base64encode(username+":"+password)
当浏览器访问使用HTTP基本认证的站点时,浏览器会提示你输入用户名和密码 。若账户或密码输入错误则返回返回一个401 的响应,同时会在响应头的WWW-中添加相关信息 。
浏览器基本认证
Token
本意为持票人或送信人,Token的设计概念类似于支票兑换的场景 。类似银行汇票手持支票坐等兑付的受款人,银行作为承兑人,会以票面上出票人的签名作为凭证来行使保障受款人收款的义务 。在 Token概念中,“票”也就时Token,Token作为一种凭证,服务端必须承认持有Token的用户拥有的对应权利,因此此时持有Token的用户就时一个 。
Authorization: Bearer
数据结构
JWT令牌设计的紧凑且安全,特别适用于分布式站点的单点登录(SSO) 。JWT的声明一般被用来在身份提供者和服务提供者之间传递被认证的用户身份信息,以便从资源服务器获取资源,同时也增加了一些额外的业务逻辑所必须的声明信息 。
例如:典型的JWT令牌字符串,注意JWT内部是没有换行的 。
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJVc2VySWQiOjEyMywiVXNlck5hbWUiOiJhZG1pbiJ9.Qjw1epD5P6p4Yy2yju3-fkq28PddznqRj3ESfALQy_U
JWT
JWT实际上由三段文本通过点号.连接构成,即JWT实际是由三部分组成的 。
组成描述示例
头部
载荷
biJ9
签名
-y_U

跨域认证

文章插图
头部
{"type":"JWT", "alg":"HS256"}
组成全称描述
typ
type
令牌类型,JWT令牌统一写为JWT 。
alg
签名算法,默认为HMAC ,简写为HS256 。
载荷
JWT有效信息包括标准中注册声明、公共的声明、私有的声明三部分 。JWT规定了7个官方字段供选用,可自定义私有字段 。
字段标准描述
jti
JWT ID
编号
sub
主题
aud
受众
iss
签发人
iat
At
签发时间
nbf
Not
生效时间
exp
time
过期时间
签名
签名的作用是对前两部分执行签名以防止篡改,签名前首先需要指定一个密钥() 。密钥只有服务器才知道,不能泄露给用户 。使用头部中指定的签名算法执行签名 。
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload) + "." + secret)
当计算出签名后,将、、三部分使用点号.拼接即可形成令牌,返回给客户端 。
和串行化算法使用的是,此算法和算法基本类似,但也有微小不同 。
JWT作为令牌会放到URL作为GET参数传递 。因此会采用算法而非普通的算法,因为算法会将URL中具有特殊含义的字符+、/、=替换或省略 。
=
省略掉
+
替换为-
/
替换为_
$ npm i -D jsonwebtoken@latest
const jwt = require("jsonwebtoken")const params = {id:1, username:"admin"}const secret = "x1fd34alml"const options = {expiresIn:"2h", algorithm:"HS256"}const token = jwt.sign(params, secret, options)const {id, username} = jwt.decode(token)
jwt-
$ npm i -D jwt-decode