php实现JWT验证的实例教程

1. 什么是JWT

JWT全称Json Web Token,是一种安全的身份验证机制。其最大的优势在于,客户端提交过来一个JWT,服务器只需要解密这个JWT,即可得到里面包含的信息。这就避免了服务器在验证身份时需要查询数据库或者缓存等操作,减轻了服务器的负担。

JWT由三部分组成:

Header:存储加密算法,例如:{"alg": "HS256", "typ": "JWT"}。

Payload:存储具体的信息,例如:{"sub": "1234567890", "name": "John Doe", "iat": 1516239022}。

Signature:用来验证JWT是否被篡改,需要使用服务器端保存的密钥进行签名

2. 如何在php中使用JWT

2.1 安装JWT库

我们可以使用官方提供的JWT库来实现对JWT的操作。在终端中使用以下命令:

composer require firebase/php-jwt

2.2 生成token

我们可以使用JWT库提供的API来生成token,生成token需要服务器端的密钥和一个有效期。示例代码如下:

use Firebase\JWT\JWT;

$payload = array(

"sub" => "1234567890",

"name" => "John Doe",

"iat" => time(),

"exp" => time() + 3600

);

$jwt = JWT::encode($payload, $key);

其中,$key是我们在服务器端保存的密钥,3600表示token的有效期为1小时。

2.3 解码payload

我们可以使用JWT库提供的API来解码payload,验证token是否被篡改,示例代码如下:

use Firebase\JWT\JWT;

try {

$decoded = JWT::decode($jwt, $key, array('HS256'));

$data = (array) $decoded;

// $data是一个数组,包含了解码后的payload信息

} catch (Exception $e) {

// token解码失败

}

其中,$key是我们在服务器端保存的密钥,array('HS256')表示采用HS256算法进行验证。

2.4 校验token

我们可以使用JWT库提供的API来校验token是否合法,示例代码如下:

use Firebase\JWT\JWT;

try {

$decoded = JWT::decode($jwt, $key, array('HS256'));

// token合法

} catch (Exception $e) {

// token验证失败

}

其中,$key是我们在服务器端保存的密钥,array('HS256')表示采用HS256算法进行验证。

3. PHP中使用JWT的优缺点

3.1 优点

JWT不需要在服务器端存储用户的登录状态,只需要将有效期内的token存储在客户端即可,减轻了服务器的负担;

JWT可以自定义存储在payload中的信息,可以避免多次查询数据库或者缓存等操作,提高了效率。

3.2 缺点

JWT没有自动的刷新机制,一旦有效期过期,需要客户端重新向服务器请求更新token;

尽管JWT的payload中可以存储一些敏感信息,但是服务器端仍然需要保留一些敏感信息,例如用户的密码等。

后端开发标签