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::store("jwt")->get("token_" . $params['jti']) ?: Cache::get("token_" . $params['jti']); $cache_token_arr = $cache_token ?: []; // if(!empty($cache_token)) // { // // $cache_token_arr[] = $token; // } $cache_token_arr[] = $token; Cache::store("jwt")->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 []; } $token_cache = Cache::store("jwt")->get("token_" . $token_info['jti']) ?: Cache::get("token_" . $token_info['jti'], []); if (!empty($token_info) && !in_array($token, $token_cache)) { 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::store("jwt")->get("token_" . $id . "_" . $type) ?: 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::store("jwt")->set("token_" . $id . "_" . $type, $token_cache); } } else { Cache::store("jwt")->set("token_" . $id . "_" . $type, []); } return success(); } }