test_lgq/niucloud/core/util/TokenAuth.php
2024-01-24 17:36:08 +08:00

110 lines
3.4 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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();
}
}