接口安全与限制调用次数

login.php

<?php

$token = generate_access_token($res['username'], $res['password'], 'http://erpserver'); //生成token

// token 存redis 1库

$redis->select(1);
$redis->set($token, $token, 1800);

/**
 * 生成token
 * @param $appID string 应用ID
 * @param $secretKey string  应用私钥
 * @param $appKey int 应用公钥
 * @return string
 */
function generate_access_token($appID, $secretKey, $appKey)
{
	$time = time();
	$sign = sha1($time . $appID . $secretKey);
	$token = base64_encode("{$time},{$appID},{$appKey},{$sign}");
	return $token;
}


/**
 * 解析TOKEN
 * @param $access_token
 * @return array
 */
function getCurrentTokenInfo($access_token)
{
	$token_array = base64_decode($access_token);
	$token_array = explode(',', $token_array); //分割token,分隔符由Token生成算法决定

	$token = [];
	$token['time'] = $token_array[0]; //时间戳
	$token['usersId'] = $token_array[1]; //id
	$token['appKey'] = $token_array[2]; //暴露在外的公钥
	$token['sign'] = $token_array[3]; //签名

	return $token['usersId'];
}

?>



conn.php

<?php

$pdo = new PDO("mysql:host=localhost;dbname=icerp_xhdz", "root", "root"); //公司 mysql连接

// 连接redis
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

?>



base.php

<?php

include 'conn.php';

// 接受前端header头传入的token
$token = $_SERVER['HTTP_TOKEN'] ?? '';


// 判断token
if ( !isset($token) || empty($token) ) {
    exit(json_encode(['code' => 199, 'msg' => '无效token']));
} 


// 获取token
$redis->select(1);
$token = $redis->get($token);


// token无效,提示用户重新登录
if ( empty($token) ) exit(json_encode(['code' => 203, 'msg' => 'token无效']));


// 限制一分钟可以调用5次接口
$redis->select(2);
$cc = $redis->get($token);
if ($cc) {
    $count = $redis->incr($token);
    if ($count > 5) exit(json_encode(['code' => 199, 'msg' => '频繁访问,请一分钟后再次尝试']));
} else {
    $redis->setex($token, 1800, 1);
}


// 更新user_token 的过期时间 (延期,保证其有效期内连续操作不掉线)
$redis->select(1);
$redis->set($token, $token, 1800);

?>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值