介绍一下API访问限制的一些实现逻辑
概述
为保证系统数据安全、稳定,开发者使用接口之前需要申请APPID、APPKEY,接口每分钟调用频率以及信任IP使用所有的API均需要通过鉴权,鉴权不通过无法正常使用为开发者提供的接口
鉴权限制说明
非法的APPID和APPKEY无法通过鉴权根据APPID不受信任的IP无法通过鉴权
根据APPID使用频率如果超过设定的值无法通过鉴权
参数说明
参数 |
必填 |
说明 |
示例 |
APPID |
是 |
申请的APPKEY |
100008 |
APPKEY |
是 |
申请的APPKEY |
89b5b9f793829180a04095639821ffa3 |
代码实现
<?php
function apiAuth($appid, $appkey) {
// appid和appkey不能为空
if (empty ( $appid ) || empty ( $appkey )) {
exit ( 'appid和appkey不能为空' );
}
$CI = &get_instance ();
$CI->load->model ( 'api_m' );
$appinfo = $CI->api_m->query ( $appid );
// 如果appid不存在退出并提示
if (count ( $appinfo ) === 0) {
exit ( 'appid不存在' );
}
$appinfo = $appinfo [0];
// 如果appid和appkey不正确直接退出并提示
if ($appinfo ['appkey'] != $appkey) {
exit ( '请检查appid和appkey是否正确' );
}
// 验证来源ip是否在信任ip列表
$trustip = explode ( '|', $appinfo ['trustip'] );
$source_ip = $_SERVER ['REMOTE_ADDR'];
if (! in_array ( $source_ip, $trustip )) {
exit ( 'IP受限' );
}
// 验证是否超过请求频率限制(memcached实现)
$mem = new Memcache ();
$mem->connect ( '127.0.0.1', 11211 );
$reset_time = $mem->get ( $appid . 'resettime' );
$count = $mem->get ( $appid . 'count' );
$limit = $appinfo ['freq'];
if ($count >= $limit) {
if (time () - $reset_time > 60) {
// 如果时间大于60秒,复位计数器
$mem->set ( $appid . 'resettime', time () );
$mem->set ( $appid . 'count', 0 );
}
exit ( '请求频率超出限制' );
} else {
// 正常请求,请求数+1
$mem->set ( $appid . 'count', $count + 1 );
}
}