* @date 2020-01-22 11:36:11 */ declare(strict_types=1); namespace Modules\Manage\Services; use App\Constants\CommonConstant; use App\Constants\ManageConstant; use App\Repositories\Utils\JwtRepository; use Hyperf\Utils\Str; use Psr\SimpleCache\CacheInterface; class AuthService { /** * Jwt受众. * * @var string */ private $jwtAud = 'manage-users'; /** * 获取存储用户设备Token的缓存Key. * @param string $managerId * @return string */ public function getManagerCacheKey($managerId) { $cacheKey = 'manager_auth_'. $managerId; return $cacheKey; } /** * 创建单点Jwt. * @param string $managerId 管理员ID * @param int $roleId 角色ID * @return array * @throws \Psr\SimpleCache\InvalidArgumentException */ public function createSingleJwt($managerId, $roleId) { $manager = new \stdClass(); $manager->manager_id = $managerId; $manager->role_id = $roleId; $jwtRepository = make(JwtRepository::class); $tokenInfo = $jwtRepository->createManageJwt($manager); $token = $tokenInfo['token']; $cacheKey = $this->getManagerCacheKey($managerId); $cache = make(CacheInterface::class); $cacheToken = $cache->has($cacheKey) ? $cache->get($cacheKey) : ''; if (!empty($cacheToken)) { $cache->delete($cacheKey); } $cache->set($cacheKey, $token, config('jwt.ttl') * 60); return $tokenInfo; } /** * 获取头部Token. * @return mixed */ public function getHeaderToken() { $token = request()->header(CommonConstant::MG_TOKEN_NAME, null); if (empty($token)) { $token = request()->input(CommonConstant::MG_TOKEN_NAME, null); } return $token; } /** * 获取管理头部handshake_flag * @return mixed */ public function getHeaderMgHandShakeFlag() { $flag = request()->header(ManageConstant::HANDSHAKE_HEADER, ''); return $flag; } /** * 获取Token中的ManagerInfo * @return array 返回manager_id, role_id */ public function getManagerInfo() { $managerInfo = []; $token = $this->getHeaderToken(); if (!empty($token)) { $jwtRepository = make(JwtRepository::class); $validateResult = $jwtRepository->validateToken($token, $this->jwtAud); if ($validateResult['is_valid']) { $managerInfo = [ 'manager_id' => !empty($validateResult['token_obj']->claims()->get('manager_id')) ? $validateResult['token_obj']->claims()->get('manager_id') : '', 'role_id' => !empty($validateResult['token_obj']->claims()->get('role_id')) ? $validateResult['token_obj']->claims()->get('role_id') : 0, ]; } } return $managerInfo; } /** * 检查头部Mg handshake是否有效. * @return bool */ public function checkValidMgHeaderHandShake() { $falg = $this->getHeaderMgHandShakeFlag(); if (empty($falg)) { return false; } // 检查是否是后台请求路径. $currentUri = request()->getRequestUri(); $defFlag = ManageConstant::HANDSHAKE_FLAG; // TODO 临时取消校验后台路径,给android方便调用postmain. // if (!Str::contains($currentUri, env('MANAGE_API_BASE_PATH'))) { // return false; // } return $defFlag == $falg; } }