159 lines
4.3 KiB
PHP
159 lines
4.3 KiB
PHP
<?php
|
|
|
|
namespace App\Service;
|
|
|
|
use App\Const\RedisConst;
|
|
use App\Tools\Tools;
|
|
use Illuminate\Support\Carbon;
|
|
use Illuminate\Support\Facades\Redis;
|
|
use Psr\Container\ContainerExceptionInterface;
|
|
use Psr\Container\NotFoundExceptionInterface;
|
|
|
|
class AuthService
|
|
{
|
|
|
|
const tokenUidInfo = [
|
|
'uid' => '',
|
|
'device' => '',
|
|
];
|
|
const uidTokenList = [
|
|
'token_1' => [
|
|
'device' => '',
|
|
'created_time' => '',
|
|
'exp_time' => '',
|
|
],
|
|
];
|
|
|
|
function checkTokenLogin($sToken): bool
|
|
{
|
|
return $this->getUserInfoByToken($sToken) != null;
|
|
}
|
|
|
|
function getUserInfoByToken($sToken)
|
|
{
|
|
if (empty($sToken)) return null;
|
|
$sUidInfo = Redis::get(RedisConst::TOKEN_UID . $sToken);
|
|
if (empty($sUidInfo)) return null;
|
|
return unserialize($sUidInfo);
|
|
}
|
|
|
|
function setUserInfoToToken($sToken, $iUid, $sDevice)
|
|
{
|
|
$sUidInfo = serialize([
|
|
'uid' => $iUid,
|
|
'device' => $sDevice,
|
|
]);
|
|
return Redis::set(RedisConst::TOKEN_UID . $sToken, $sUidInfo, RedisConst::COMMON_EXP_TIME);
|
|
}
|
|
|
|
function delUserInfoToToken($sToken)
|
|
{
|
|
return Redis::del(RedisConst::TOKEN_UID . $sToken);
|
|
}
|
|
|
|
function getAllTokenInfoByUid($iUid)
|
|
{
|
|
$sTokenList = Redis::get(RedisConst::UID_TOKENS . $iUid);
|
|
if (empty($sTokenList)) return null;
|
|
return unserialize($sTokenList);
|
|
}
|
|
|
|
function checkTokenInUid($iUid, $sToken): bool
|
|
{
|
|
$aTokenInfoList = $this->getAllTokenInfoByUid($iUid);
|
|
if (empty($aTokenInfoList)) return false;
|
|
$aTokenList = array_keys($aTokenInfoList);
|
|
return in_array($sToken, $aTokenList);
|
|
}
|
|
|
|
function addTokenToUidInfo($iUid, $sToken, $sDevice)
|
|
{
|
|
$aTokenInfoList = $this->getAllTokenInfoByUid($iUid);
|
|
if (empty($aTokenInfoList)) {
|
|
$aTokenInfoList = [];
|
|
}
|
|
$aTokenInfoList[$sToken] = [
|
|
'device' => $sDevice,
|
|
'created_time' => Carbon::now()->toDateTimeString(),
|
|
'exp_time' => Carbon::parse(time() + RedisConst::COMMON_EXP_TIME)->toDateTimeString(),
|
|
];
|
|
$sTokenList = serialize($aTokenInfoList);
|
|
return Redis::set(RedisConst::UID_TOKENS . $iUid, $sTokenList);
|
|
}
|
|
|
|
function delTokenByUidInfo($iUid, $sToken)
|
|
{
|
|
$aTokenInfoList = $this->getAllTokenInfoByUid($iUid);
|
|
if (empty($aTokenInfoList)) return false;
|
|
if (!isset($aTokenInfoList[$sToken])) return false;
|
|
unset($aTokenInfoList[$sToken]);
|
|
$sTokenList = serialize($aTokenInfoList);
|
|
return Redis::set(RedisConst::UID_TOKENS . $iUid, $sTokenList);
|
|
}
|
|
|
|
function getTokenFromReq(\Illuminate\Http\Request $request = null)
|
|
{
|
|
if ($request == null) $request = request();
|
|
$sToken = $request->header('_token');
|
|
if (!empty($sToken)) return $sToken;
|
|
$sToken = $request->input('_token');
|
|
if (!empty($sToken)) return $sToken;
|
|
return null;
|
|
}
|
|
|
|
function generateTokenStr(): string
|
|
{
|
|
return time() . Tools::generateRandStr(24);
|
|
}
|
|
|
|
//登入使用
|
|
function createTokenToUser($iUid, $sDevice): string
|
|
{
|
|
do {
|
|
$sToken = $this->generateTokenStr();
|
|
if (!$this->checkTokenLogin($sToken)) break;
|
|
} while (1);
|
|
|
|
$this->setUserInfoToToken($sToken, $iUid, $sDevice);
|
|
$this->addTokenToUidInfo($iUid, $sToken, $sDevice);
|
|
return $sToken;
|
|
}
|
|
|
|
//登出使用
|
|
function delTokenToUser($iUid, $sToken): void
|
|
{
|
|
$this->delUserInfoToToken($sToken);
|
|
$this->delTokenByUidInfo($iUid, $sToken);
|
|
}
|
|
|
|
function getTokenInfo()
|
|
{
|
|
$sToken = $this->getTokenFromReq();
|
|
if (empty($sToken)) return null;
|
|
$aUserInfo = $this->getUserInfoByToken($sToken);
|
|
if (empty($aUserInfo)) return null;
|
|
return $aUserInfo;
|
|
}
|
|
|
|
function setCurrentUser(array $aUser): void
|
|
{
|
|
app()->singleton('customerUser',function () use ($aUser){
|
|
return $aUser;
|
|
});
|
|
}
|
|
|
|
/**
|
|
* @throws ContainerExceptionInterface
|
|
* @throws NotFoundExceptionInterface
|
|
*/
|
|
function getCurrentUser()
|
|
{
|
|
if(app()->has('customerUser')){
|
|
return app()->get('customerUser');
|
|
}
|
|
return null;
|
|
}
|
|
|
|
|
|
}
|