110 lines
3.4 KiB
PHP
110 lines
3.4 KiB
PHP
<?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 类型(admin,site,home)
|
||
* @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();
|
||
}
|
||
}
|