博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PhalApi:[1.22] 签名验证:自定义签名规则
阅读量:6832 次
发布时间:2019-06-26

本文共 2547 字,大约阅读时间需要 8 分钟。

hot3.png

1.22.1 过滤器服务

正如我们核心思想DI里面所说的,我们把后台很多功能资源都称为服务,所以在PhalApi框架中我们已经系统规定了**DI()->filter**为过滤器服务,以实现接口请求时的一些拦截操作,一如现在要说明的签名验证。

在接口进行初始化时,会自动调用已注册的过滤器服务 DI()->filter ,关键的代码如下:

//$vim ./PhalApi/PhalApi/Api.php    public function init()    {        $this->createMemberValue();        $this->filterCheck();        $this->checkStatus();    }    protected function filterCheck()    {        $filter = DI()->filter;        if (isset($filter)) {            $filter->check();        }    }

所以,如果我们需要实现签名验证,只需要简单的两步即可:

  • 1、实现过滤器接口 PhalApi_Filter::check()

  • 2、注册过滤器服务 DI()->filter

1.22.2 微信签名示例

下面以大家熟悉的 为例,进行示例说明。

(1)实现过滤器接口 PhalApi_Filter::check()

通常我们约定返回ret = 402表示验证失败,所以当签名失败时,我们可以返回ret = 402以告知客户端签名不对。根据微信的检验signature的PHP示例代码,我们可以快速实现自定义签名规则,如:

//$ vim ./Demo/Common/SignFilter.php 
request->get('signature');        $timestamp = DI()->request->get('timestamp');        $nonce = DI()->request->get('nonce');          $token = 'Your Token Here ...';        $tmpArr = array($token, $timestamp, $nonce);        sort($tmpArr, SORT_STRING);        $tmpStr = implode( $tmpArr );        $tmpStr = sha1( $tmpStr );        if ($tmpStr != $signature) {            throw new PhalApi_Exception_BadRequest('wrong sign', 1);        }    }}

(2)注册过滤器服务 DI()->filter

随后,我们只需要再简单地注册一下过滤器服务即可,在init.php初始化文件最后追加:

//$ vim ./Public/init.php //签名验证服务 DI()->filter = 'Common_SignFilter';

(3)运行效果

当我们再次请求接口时,如默认的服务:/demo/?service=Default.Index,即会出现以下的错误: apic  

即:

{    "ret": 401,    "data": [    ],    "msg": "非法请求:wrong sign"}

如果符合接口签名的验证,则会正常返回我们熟悉的内容,如:

/demo/?service=Default.Index&signature=b75e0a1b574d4e111a1d6ed3c9cfbe2ccdc09404&timestamp=123&nonce=123

会返回:

{    "ret": 200,    "data": {        "title": "Default Api",        "content": "PHPer您好,欢迎使用PhalApi!",        "version": "1.1.0",        "time": 1423055188    },    "msg": ""}

1.22.3 特殊的场景

(1)个别接口不需要验签?

在注册好统一的接口验签的过滤器拦截服务后,是会存在这样一种情况:即个别的接口不需要签名。

而这种情况,我们也是有考虑到的。所以在提供了公共的功能的情况下,我们是可以快速灵活地进行定制化和扩展。

当我们个别的接口不需要签名验证时,只需要简单地在接口子类里面重定义过滤器的检测即可,如在我们熟悉的默认服务器取消签名验证:

//vim ./Demo/Api/Default.php class Api_Default extends PhalApi_Api{    //....    protected function filterCheck()    {    }}

1.22.4 更好地建议

通常关于接口签名这块,我们还需要:

  • 1、为不同的接入方定义不同的密钥和私钥;

  • 2、如果业务需要,为各个接口、各个接入方分配调用权限;

  • 3、统一签名参数的规则,可以配置在./Config/app.php中的,如上面的签名需要的参数,我们可以追加统一的参数规则:

    /** * 应用接口层的统一参数 */'apiCommonRules' => array(    'signature' => array('name' => 'signature', 'require' => true),    'timestamp' => array('name' => 'signature', 'require' => true),    'nonce' => array('name' => 'nonce', 'require' => true),),

转载于:https://my.oschina.net/dogstar/blog/372950

你可能感兴趣的文章
Reverse Integer之Java实现
查看>>
Linux的SSH服务初学
查看>>
不同于FTP的另一款文件传输工具
查看>>
MYSQL 逻辑架构
查看>>
第11课--11_04_Linux网络配置之四 ifconfig及ip命令详解
查看>>
Linux命令之grep/sed/awk等行转列
查看>>
3.1 账户管理
查看>>
MySQL 多张表合并成一张表
查看>>
朋友圈广告投放优势及广告投放案例分享
查看>>
vivo Z3的Usb调试模式在哪里,开启vivo Z3Usb调试模式的教程
查看>>
能够让你提升的九个 Python 小技巧
查看>>
css3 greyscale实现去色 css3实现图片或页面变为黑白效果
查看>>
默认路由的配置
查看>>
AJPFX辨析Java中运算符 ++ 和 += 的区别
查看>>
如何在CAD中提取图纸上标注的内容
查看>>
中小企业运维自动化部署实战
查看>>
weblogic Java反序列化漏洞测试和解决
查看>>
我的友情链接
查看>>
svn高可用集群搭建
查看>>
python_day8のSocket
查看>>