request->host(); $time = time(); $params += [ 'iss' => $host, 'aud' => $host, 'iat' => $time, 'nbf' => $time, 'exp' => strtotime('+ 168hour'), // 'exp' => strtotime('+ 3min'), 'user' => $user, ]; $params['jti'] = [ 'uid' => $uid, 'type' => $type ]; $token = JWT::encode($params, Env::get('api.app_key', 'default')); return compact('token', 'params'); } /** * 解析token * @param string $jwt * @return array */ public function parseToken (string $jwt): array { $this->token = $jwt; list($headb64, $bodyb64, $cryptob64) = explode('.', $this->token); $payload = JWT::jsonDecode(JWT::urlsafeB64Decode($bodyb64)); return [$payload->jti->uid, $payload->jti->type]; } /** * 验证token * @param string $token * @return array */ public function verifyToken (string $token): array { JWT::$leeway = 60; $jwt = JWT::decode($token, Env::get('api.app_key', 'default'), array('HS256')); $jwt = object_array($jwt); return $jwt; } /** * 获取token并放入令牌桶 * @param int $uid * @param array|null $user * @param string $type * @return string */ public function createToken (int $uid, ?array $user = null, string $type = ''): string { $tokenInfo = $this->getToken($uid, $user, $type); $exp = $tokenInfo['params']['exp'] - $tokenInfo['params']['iat'] + 60; CacheServices::setTokenBucket(md5('yjbuy:' . $uid), ['uid' => $uid, 'type' => $type, 'token' => $tokenInfo['token'], 'exp' => $exp, 'user' => $tokenInfo['params']['user']], (int)$exp); return $tokenInfo['token']; } }