推荐一个 php的JWT类库
时间: 2023-11-07 20:58:38 浏览: 48
推荐一个常用的 PHP JWT 类库:firebase/php-jwt。
这个类库提供了 JWT 的编码和解码功能,并支持多种加密算法。使用起来非常简单,以下是一个例子:
```php
use Firebase\JWT\JWT;
// 创建 token
$payload = array(
"sub" => "1234567890",
"name" => "John Doe",
"iat" => 1516239022
);
$secret_key = "your_secret_key";
$token = JWT::encode($payload, $secret_key);
// 解码 token
$decoded = JWT::decode($token, $secret_key, array('HS256'));
// 访问 payload 数据
echo $decoded->sub;
echo $decoded->name;
echo $decoded->iat;
```
这个类库还提供了更多高级功能,如自定义 header 和 claims、设置过期时间、验证 token 等等。具体使用方法可以参考官方文档:https://github.com/firebase/php-jwt。
相关问题
写一个PHP jwt 登录
好的,以下是一个使用 PHP JWT 实现登录的简单示例代码:
首先,我们先安装 PHP JWT 库,可以使用 Composer 进行安装:
```
composer require firebase/php-jwt
```
然后在 PHP 文件中引用 JWT 库:
```php
require_once 'vendor/autoload.php';
use Firebase\JWT\JWT;
```
接下来我们实现登录逻辑:
```php
// 获取客户端提交的用户名和密码
$username = $_POST['username'];
$password = $_POST['password'];
// 根据用户名和密码从数据库中查询用户信息
$user = getUserByUsernameAndPassword($username, $password);
// 如果用户不存在或者密码不正确,返回错误提示
if (!$user || !password_verify($password, $user['password'])) {
die('用户名或密码错误');
}
// 生成 JWT token
$token = JWT::encode(
[
'sub' => $user['id'], // 用户 ID
'exp' => time() + 3600 // 过期时间为 1 小时
],
'my_secret_key' // 自定义秘钥
);
// 将 token 返回给客户端
echo $token;
```
在客户端访问需要登录才能访问的 API 时,客户端需要在请求的 Header 中添加 Authorization 字段,值为 Bearer + 空格 + token,例如:
```
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmJmIjoxNTE2MjM5MDIyLCJleHAiOjE1MTYyMzkwMjJ9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
```
服务端在接收到请求后,需要验证 token 的合法性:
```php
// 获取 token
$token = $_SERVER['HTTP_AUTHORIZATION'];
// 去掉 Bearer 和空格,获取真正的 token
$token = str_replace('Bearer ', '', $token);
try {
// 验证 token
$decoded = JWT::decode($token, 'my_secret_key', array('HS256'));
$user_id = $decoded->sub;
// 根据用户 ID 获取用户信息
$user = getUserById($user_id);
// 如果用户不存在,返回未授权的错误
if (!$user) {
http_response_code(401);
die('未授权');
}
// 用户已登录,执行需要登录才能访问的操作
// ...
} catch (Exception $e) {
http_response_code(401);
die('未授权');
}
```
以上代码只是一个简单的示例,实际情况下还需要考虑更多的安全问题,例如 token 的过期时间、token 的刷新和撤销等。
给一个 jwt 的例子
好的,以下是一个 JWT 的例子:
```
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
```
这个 JWT 由三个部分组成,每个部分都由 . 分隔开来:
- 头部(Header):eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
- 载荷(Payload):eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
- 签名(Signature):SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
其中,头部和载荷都是经过 Base64 编码的 JSON 对象,签名则是用于验证 JWT 真实性的字符串。可以通过将头部和载荷进行 Base64 解码,再加上一个秘钥,使用指定的算法(例如 HS256)生成签名。在验证 JWT 时,可以使用相同的秘钥和算法,对头部和载荷进行 Base64 解码并生成签名,然后将生成的签名与 JWT 中的签名进行比较,如果一致说明 JWT 有效,否则 JWT 无效。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)