<?php
namespace ApiV3Bundle\Controller;
use ApiV3Bundle\Util\AssetHelper;
use Biz\Theme\Service\ThemeService;
use Firebase\JWT\JWT;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Topxia\Service\Common\ServiceKernel;
class AuthController extends BaseController
{
public function getJwtAction(Request $request)
{
$user = $this->getUser();
if (empty($user) || !$user->isLogin()) {
return $this->createJsonResponse([
'message' => '用户未登录',
], Response::HTTP_UNAUTHORIZED);
}
$userProfile = $this->getUserService()->getUserProfile($user['id']);
$secret = ServiceKernel::instance()->getParameter('secret');
// token 过期时间不能太小,前端会提前 1 分钟刷新
$ttl = 60 * 5;
$payload = [
'sub' => (string) $user['id'],
'iss' => 'ES SESSION',
'for' => 'access',
'exp' => time() + $ttl,
];
return $this->createJsonResponse([
'id' => (int) $user['id'],
'nickname' => (string) $user['nickname'],
'truename' => (string) $userProfile['truename'],
'roles' => $user['roles'],
'avatar' => AssetHelper::getFurl($user['smallAvatar'] ?? '', 'avatar.png'),
'locale' => $request->getLocale(),
'mainColor' => $this->getThemeService()->getCurrentThemeConfig()['confirmConfig']['maincolor'] ?? 'blue',
'token' => JWT::encode($payload, $secret, 'HS256', $this->encrypt($request->getSession()->getId(), $secret)),
'tokenTtl' => $ttl * 1000,
]);
}
/**
* @return ThemeService
*/
private function getThemeService()
{
return $this->getBiz()->service('Theme:ThemeService');
}
private function encrypt(string $sessionId, $secret): string
{
return hash_hmac('sha256', $sessionId, $secret);
}
}