| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- <?php
- /**
- * 认证服务.
- *
- * @author nj <nj@gmail.com>
- * @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;
- }
- }
|