这是我参与「第五届青训营 」伴学笔记创作活动的第 11 天
在进行青训营大项目开发时,需要使用Token来进行鉴权。那么这里的Token其实就可以使用JWT的Token来进行处理。
JWT
JWT全称Json Web Token。每次请求时都带上这个token值,即可使用它可以对一个用户进行鉴权,获取其中的一些用户信息。具体它是怎么实现的呢?
Token的组成
为了保证Token的安全性,它会包括3个部分的数据。例如一个token如下:(在每个点处进行了换行)
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJleHAiOjE2NzYzMDE5MjYsIm9yaWdfaWF0IjoxNjc2Mjk4MzI2LCJ1c2VySUQiOjEwfQ.
lsnJdcUBpN_Io2nWWf7UrMHRprHcia_uOsNOqnpL5H0
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9headereyJleHAiOjE2NzYzMDE5MjYsIm9yaWdfaWF0IjoxNjc2Mjk4MzI2LCJ1c2VySUQiOjEwfQpayloadlsnJdcUBpN_Io2nWWf7UrMHRprHcia_uOsNOqnpL5H0signature
token分为了header,payload、signature,3个部分。
header
header是令牌的头部,他记录了令牌的类型和签名算法,对其进行base64解码,可以得到json:
{"alg":"HS256","typ":"JWT"}
HS256就是所使用的签名算法,hmac sha256。typ默认为JWT。
payload
要生成一个Token,首先我们需要准备好这个用户的json数据的格式,例如
{"userID": xxxx}
这里userId代表这个用户的用户ID。通常我们还可以给他添加其他字段,比如生成时间,过期时间。
payload是一个token的主体,也是一个json对象。对其进行base64解码:
{"exp":1676301926,"orig_iat":1676298326,"userID":10}
- exp 令牌过期时间
- orig_iat 令牌生成时间
- userID 实际有效信息
signature
这一部分是令牌的签名。它可以用来防止令牌不被修改。它是由前两部分进行签名后的结果。
在服务端,设置好密钥,对eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NzYzMDE5MjYsIm9yaWdfaWF0IjoxNjc2Mjk4MzI2LCJ1c2VySUQiOjEwfQ进行HMAC SHA256算法进行计算。
例如我这里的密钥是:YourSecretKeyHere,ReplaceBeforeProduction,使用该密钥进行HMAC SHA256进行签名计算。
可以得到最后的签名lsnJdcUBpN_Io2nWWf7UrMHRprHcia_uOsNOqnpL5H0。把他们进行拼接,最后得到了整个token。
服务器处理jwt的过程中,会对header和payload,进行同样的签名计算,并判断签名计算结果是否等于最后的签名字符串,如果不符,证明token被恶意修改,可以拒绝对其服务。如果签名结果和提供的签名一致,就可以继续解码header和payload,并从payload中解析出自己需要的信息,提供给业务逻辑。
在实际请求中,Token不仅可以存放在POST、GET请求的参数中。还可以将其设置在HTTP请求头中,这些方式都可以让服务端轻松地获取token并进行后续处理