php jwt 用户登录完整示例
时间: 2023-10-07 07:09:42 浏览: 40
当然,我可以为你提供一个完整的示例。首先,在后端使用 PHP 生成一个 JWT,然后将其发送给前端。前端将 JWT 存储在本地,并在每次请求时将其作为 Authorization 头部的 Bearer token 发送给后端。后端验证 JWT 的有效性,如果验证通过,则说明用户已经登录,并且可以访问相应的资源。需要注意的是,JWT 中应该包含必要的用户信息,例如用户 ID,以便后端可以根据需要进行相应的操作。
相关问题
php Jwt接口安全示例
PHP JWT 接口安全示例:
1. 首先需要安装 JWT 扩展包,如果使用 composer 可以在命令行中输入 "composer require firebase/php-jwt" 来安装。
2. 生成 JWT 令牌:
```
<?php
require_once "vendor/autoload.php";
use \Firebase\JWT\JWT;
$secret_key = "YOUR_SECRET_KEY";
$issuer_claim = "THE_ISSUER";
$audience_claim = "THE_AUDIENCE";
$issuedat_claim = time(); // issued at
$notbefore_claim = $issuedat_claim + 10; //not before in seconds
$expire_claim = $issuedat_claim + 60; // expire time in seconds
$token = array(
"iss" => $issuer_claim,
"aud" => $audience_claim,
"iat" => $issuedat_claim,
"nbf" => $notbefore_claim,
"exp" => $expire_claim,
"data" => array(
"user_id" => "1",
"user_name" => "John Doe",
)
);
$jwt = JWT::encode($token, $secret_key);
echo $jwt;
```
3. 验证 JWT 令牌:
```
<?php
require_once "vendor/autoload.php";
use \Firebase\JWT\JWT;
$secret_key = "YOUR_SECRET_KEY";
$jwt = "YOUR_JWT_TOKEN";
try {
$decoded = JWT::decode($jwt, $secret_key, array('HS256'));
print_r($decoded);
} catch (\Firebase\JWT\ExpiredException $e) {
echo json_encode(array(
"status" => $e->getStatusCode(),
"message" => $e->getMessage()
));
} catch (\Firebase\JWT\SignatureInvalidException $e) {
echo json_encode(array(
"status" => $e->getStatusCode(),
"message" => $e->getMessage()
));
} catch (\Firebase\JWT\BeforeValidException $e) {
echo json_encode(array(
"status" => $e->getStatusCode(),
"message" => $e->getMessage()
));
} catch (\Firebase\JWT\InvalidArgumentException $e) {
echo json_encode(array(
"status" => $e->getStatusCode(),
"message" => $e->getMessage()
));
} catch (\Exception $e) {
echo json_encode(array(
"status" => $e->getStatusCode(),
"message" => $e->getMessage()
写一个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 的刷新和撤销等。