test_lgq/niucloud/core/util/TokenAuth.php

110 lines
3.4 KiB
PHP
Raw Normal View History

2024-01-24 17:36:08 +08:00
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的saas管理平台
// +----------------------------------------------------------------------
// | 官方网址https://www.niucloud-admin.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace core\util;
use Firebase\JWT\JWT;
use think\facade\Cache;
use think\facade\Env;
use think\Response;
/**
* token工具类
* Class TokenAuth
* @package core\util
*/
class TokenAuth
{
/**
*创建token
* @param int $id 编码 一般传入用户id
* @param string $type 类型adminsitehome
* @param array $params 参数 传入id, name
* @param int $expire_time 有效期
* @return array
*/
public static function createToken(int $id, string $type, array $params = [], int $expire_time = 0): array
{
$host = app()->request->host();
$time = time();
$params += [
'iss' => $host,
'aud' => $host,
'iat' => $time,
'nbf' => $time,
'exp' => $time + $expire_time,
];
$params['jti'] = $id . "_" . $type;
$token = JWT::encode($params, Env::get('app.app_key', 'niucloud456$%^'));
$cache_token = Cache::get("token_" . $params['jti']);
$cache_token_arr = $cache_token ?: [];
// if(!empty($cache_token))
// {
//
// $cache_token_arr[] = $token;
// }
$cache_token_arr[] = $token;
Cache::tag("token")->set("token_" . $params['jti'], $cache_token_arr);
return compact('token', 'params');
}
/**
* 解析token
* @param string $token
* @param string $type
* @return array
*/
public static function parseToken(string $token, string $type): array
{
$payload = JWT::decode($token, Env::get('app.app_key', 'niucloud456$%^'), ['HS256']);
if (!empty($payload)) {
$token_info = json_decode(json_encode($payload), true, 512, JSON_THROW_ON_ERROR);
if (explode("_", $token_info['jti'])[1] != $type) {
return [];
}
if (!empty($token_info) && !in_array($token, Cache::get('token_' . $token_info['jti'], []))) {
return [];
}
return $token_info;
} else {
return [];
}
}
/**
* 清理token
* @param int $id
* @param string $type
* @param string|null $token
* @return Response
*/
public static function clearToken(int $id, string $type, ?string $token = '')
{
if (!empty($token)) {
$token_cache = Cache::get("token_" . $id . "_" . $type, []);
//todo 也可以通过修改过期时间来实现
if (!empty($token_cache)) {
if (($key = array_search($token, $token_cache)) !== false) {
array_splice($token_cache, $key, 1);
}
Cache::set("token_" . $id . "_" . $type, $token_cache);
}
} else {
Cache::set("token_" . $id . "_" . $type, []);
}
return success();
}
}