【开源夏令营】PFIF公益寻人平台(七)

介绍一下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 );
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值