src/ApiV3Bundle/Controller/AuthController.php line 22

Open in your IDE?
  1. <?php
  2. namespace ApiV3Bundle\Controller;
  3. use ApiV3Bundle\Util\AssetHelper;
  4. use Biz\Theme\Service\ThemeService;
  5. use Firebase\JWT\JWT;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\HttpFoundation\Response;
  8. use Topxia\Service\Common\ServiceKernel;
  9. class AuthController extends BaseController
  10. {
  11.     public function getJwtAction(Request $request)
  12.     {
  13.         $user $this->getUser();
  14.         if (empty($user) || !$user->isLogin()) {
  15.             return $this->createJsonResponse([
  16.                 'message' => '用户未登录',
  17.             ], Response::HTTP_UNAUTHORIZED);
  18.         }
  19.         $userProfile $this->getUserService()->getUserProfile($user['id']);
  20.         $secret ServiceKernel::instance()->getParameter('secret');
  21.         // token 过期时间不能太小,前端会提前 1 分钟刷新
  22.         $ttl 60 5;
  23.         $payload = [
  24.             'sub' => (string) $user['id'],
  25.             'iss' => 'ES SESSION',
  26.             'for' => 'access',
  27.             'exp' => time() + $ttl,
  28.         ];
  29.         return $this->createJsonResponse([
  30.             'id' => (int) $user['id'],
  31.             'nickname' => (string) $user['nickname'],
  32.             'truename' => (string) $userProfile['truename'],
  33.             'roles' => $user['roles'],
  34.             'avatar' => AssetHelper::getFurl($user['smallAvatar'] ?? '''avatar.png'),
  35.             'locale' => $request->getLocale(),
  36.             'mainColor' => $this->getThemeService()->getCurrentThemeConfig()['confirmConfig']['maincolor'] ?? 'blue',
  37.             'token' => JWT::encode($payload$secret'HS256'$this->encrypt($request->getSession()->getId(), $secret)),
  38.             'tokenTtl' => $ttl 1000,
  39.         ]);
  40.     }
  41.     /**
  42.      * @return ThemeService
  43.      */
  44.     private function getThemeService()
  45.     {
  46.         return $this->getBiz()->service('Theme:ThemeService');
  47.     }
  48.     private function encrypt(string $sessionId$secret): string
  49.     {
  50.         return hash_hmac('sha256'$sessionId$secret);
  51.     }
  52. }