JSON Web Token (JWT)简介

最近在搞一个项目的时候,另外一个后端提出使用JWT作为用户的凭证。这的确是我第一次听说这个词,在搜索引擎上搜了一下,外加看了别人写的代码,大概明白是什么东西了。

本文参考了网上的部分教程以及本人在某个项目中的实践。

一、它是什么

按照我的理解,JWT是前后端交互中,一种类似凭证的东西。登录之后,后端把JWT交给前端,前端一般存在cookie里,然后进行操作的时候,解密JWT得到用户信息来进行下一步。

根据 RFC 7519 的说法,JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties.

总之,就是拿来给前后端交互用的。

二、长什么样

 eyJJRCI6MTAsIm5hbWUiOiJcdTVlZDZcdTZiNjZcdTgwMDAiLCJwaG9uZW51bSI6IjEwMDg2Iiwic3R1bnVtIjoiMjAxODM0MDEwMzAyNiIsImJvcm4iOjE1Njc4NDE4NDQsImV4cGlyZSI6MTU2ODQ0NjY0NCwidmVyc2lvbiI6MX0%3D28cd147105144cc51e6f89b9d4b1a4a0717185cdbb7fdf1fcbbc543056c4cf56 

看起来杂乱无章,实际上他是经过了加密才导致这样的。

可以分为几部分,信息的部分和秘钥的部分。

三、实现

PHP的实现比较简单,这段是另一个后端写的代码

加密:

$data = [
        'ID' => $ID,
        'name' => $name,
        'born' => time(),
        'expire' => time() + 7 * 24 * 3600,
        'version' => $version
    ];
$data_64 = base64_encode(json_encode($data));
$sign = hash_hmac('sha256', $data_64, JWT_SECRET);
return $data_64 . $sign;

解密:

$sig = substr($jwt_string, -64, 64);
$data = substr($jwt_string, 0, strlen($jwt_string) - 64);
$data_str = base64_decode($data);
$data_arr = json_decode($data_str, true);
if ($data_arr === null)
    return null;

if ($data_str === false || hash_hmac('sha256', $data, JWT_SECRET) !== $sig)
    return null;
//$version从数据库获取
//假设获取得到用户信息是$user
$version = $user->version;
if ($data_arr['expire'] < time() || $data_arr['version'] < $version)
    return null;

return $data_arr;

数据库里要存储一个version字段,每次改密码时要+1。

其实我觉得登录时也应该要+1,但是好像另一个后端没写,以后自己实现的时候要注意。

加密时就是把你所要存储的信息放到data数组里即可。

解密时,还需验证用户是否存在之类的。

发表评论

电子邮件地址不会被公开。 必填项已用*标注