token生成及刷新,验证

class A
{
public function setToken($name, $id)
{
//用户名、此时的时间戳,并将过期时间拼接在一起
$admin = $name; //获取前台传来的用户账号
$time = time();
$aging = 86400;
$end_time = time() + $aging;
$tTr = t h i s − > n u m b e r e n c r y p t ( this->number_encrypt( this>numberencrypt(time); //自定义方法(给数字进行加密,可解密,下方有实例)
$tEtr = t h i s − > n u m b e r e n c r y p t ( this->number_encrypt( this>numberencrypt(end_time);
$idS = t h i s − > n u m b e r e n c r y p t ( this->number_encrypt( this>numberencrypt(id);
$info = $admin . ‘.’ . $id . ‘.’ . $time . ‘.’ . $end_time;
i n f o E = b a s e 6 4 e n c o d e ( infoE = base64_encode( infoE=base64encode(admin) . ‘.’ . $idS . ‘.’ . $tTr . ‘.’ . $tEtr;
//根据以上信息信息生成签名(密钥为 siasqr)
$signature = hash_hmac(‘md5’, $info, ‘siasqr’);
//最后将这两部分拼接起来,得到最终的Token字符串
$token = $infoE . ‘.’ . $signature;
return [
‘token’ => $token,
‘name’ => $admin,
‘id’ => $id,
‘aging’ => $aging + 10
];
}

/**
 *数字自定义加密
 */
public function number_encrypt($n)
{
    $dictionary = ['0' => 'aZ', '1' => 'Bw', '2' => 'cYq', '3' => 'Dx', '4' => 'eV', '5' => 'FvU', '6' => 'gT', '7' => 'Hs', '8' => 'iRp', '9' => 'Jo', '.' => 'kL'];
    $nS = (string)$n;
    $nA = str_split($nS);
    $r = '';
    foreach ($nA as $val) {
        $r .= isset($dictionary[$val]) ? $dictionary[$val] : '';
    }
    return $r;
}

/**
 *数字解密
 */
public function number_decrypt($s)
{
    $dictionary = [0 => '/aZ/', 1 => '/Bw/', 2 => '/cYq/', 3 => '/Dx/', 4 => '/eV/', 5 => '/FvU/', 6 => '/gT/', 7 => '/Hs/', 8 => '/iRp/', 9 => '/Jo/', 10 => '/kL/'];
    $rp = [0 => '0', 1 => '1', 2 => '2', 3 => '3', 4 => '4', 5 => '5', 6 => '6', 7 => '7', 8 => '8', 9 => '9', 10 => '.'];
    $r = preg_replace($dictionary, $rp, $s);
    return $r;
}

/**
 *检查token
 */
public function check_token($token)
{
    /**** api传来的token ****/
    if (!isset($token) || empty($token)) {
        $msg['error'] = 1;
        $msg['msg'] = 'Illegal request';
        return $msg;
    }
    //对比token
    $explode = explode('.', $token);//以.分割token为数组
    if (!empty($explode[0]) && !empty($explode[1]) && !empty($explode[2]) && !empty($explode[3]) && !empty($explode[4])) {
        $stTime = $this->number_decrypt($explode[2]);
        $edTime = $this->number_decrypt($explode[3]);
        $name = base64_decode($explode[0]);
        $id = $this->number_decrypt($explode[1]);
        if ($edTime - $stTime > 604800) {
            $msg['error'] = 1;
            $msg['msg'] = 'Illegal request';
            return $msg;
        }
        if ($stTime > time()) {
            $msg['error'] = 1;
            $msg['msg'] = 'Illegal request';
            return $msg;
        }
        $info = $name . '.' . $id . '.' . $stTime . '.' . $edTime;//信息部分
        $true_signature = hash_hmac('md5', $info, 'siasqr');//正确的签名
        if (time() > $this->number_decrypt($explode[3])) {
            $msg['error'] = 1;
            $msg['msg'] = 'Token已过期,请重新登录';
            return $msg;
        }
        if ($true_signature == $explode[4]) {
        //检查是否有刷新
            $rf = $this->refresh_token(['name' => $name, 'id' => $id, 'stTime' => $stTime]);
            if ($rf == false) {
                $msg['name'] = $name;
                $msg['id'] = $id;
                $msg['rfs'] = 0;
                return $msg;
            }
            $msg['aging'] = $rf['aging'];
            $msg['token'] = $rf['token'];
            $msg['name'] = $name;
            $msg['id'] = $id;
            $msg['rfs'] = 1;
            return $msg;
        } else {
            $msg['error'] = 1;
            $msg['msg'] = 'Signature failed';
            return $msg;
        }
    } else {
        $msg['error'] = 1;
        $msg['msg'] = 'Signature failed';
        return $msg;
    }
}

/**
 *刷新token
 */
private function refresh_token($exToken)
{
    if (time() - $exToken['stTime'] >= 420) {
        return $this->setToken($exToken['name'], $exToken['id']);
    }
    return false;
}

}

$model = new A;
$res = $model->setToken(‘zhq123’,1);
$res2 = m o d e l − > c h e c k t o k e n ( model->check_token( model>checktoken(res[‘token’]);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zw621

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值