<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 過濾器 ## 默認可用的MD5簽名 基于很多同學對接口簽名驗證比較陌生,PhalApi提供了一個基本版的接口驗證服務。主要是基于md5進行的簽名生成,這個只能作為一般性的參考。大家可以在此基礎上進行調整延伸。 默認情況下,在```./config/di.php```文件中去掉注釋便可開啟此接口驗證,即: ```php // 簽名驗證服務 $di->filter = new \PhalApi\Filter\SimpleMD5Filter(); ``` 其驗簽的算法如下(如注釋所示): ```php 1、排除簽名參數(默認是sign) 2、將剩下的全部參數,按參數名字進行字典排序 3、將排序好的參數,全部用字符串拼接起來 4、進行md5運算 ``` 以下面的示例參數為例,即: ``` 1、排除簽名參數(默認是sign) ?service=Examples_CURD.Get&id=1 2、將剩下的全部參數,按參數名字進行字典排序 id=1 service=Examples_CURD.Get 3、將排序好的參數,全部用字符串拼接起來 "1Examples_CURD.Get" = "1" + "Examples_CURD.Get" 4、進行md5運算 sign = 3ba5f5f03a90b2a648f5dd1df7387e26 = md5("1Examples_CURD.Get") 5、請求時,加上簽名參數 ?service=Examples_CURD.Get&id=1&sign=3ba5f5f03a90b2a648f5dd1df7387e26 ``` 下面是兩個調用示例,錯誤請求下(即簽名失敗): ``` http://dev.phalapi.net/?service=Examples_CURD.Get&id=1&sign=xxx 返回: { "ret": 406, "data": [], "msg": "非法請求:簽名錯誤" } ``` > 溫馨提示:簽名錯誤情況下,可以查看日記獲得正確的sign,如: > ```2017-07-22 12:02:18|DEBUG|Wrong Sign|{"needSign":"3ba5f5f03a90b2a648f5dd1df7387e26"}``` 正常請求下(帶sign簽名): ``` http://dev.phalapi.net/?service=Examples_CURD.Get&id=1&sign=3ba5f5f03a90b2a648f5dd1df7387e26 ``` 如果不想使用sign作為關鍵的簽名參數,可以在注冊時指定,如使用縮寫s: ```php $di->filter = new \PhalApi\Filter\SimpleMD5Filter('s'); ``` ## 白名單配置 對于不需要進行簽名驗證的接口服務,可以使用白名單配置,通過框架自身實現對指定配置的接口服務排除。即調用的接口服務,如果配置了白名單,則不調用過濾器。 接口服務白名單配置是:```app.service_whitelist```,即配置文件```./config/app.php```里面的```service_whitelist```配置,其默認值是: ```php 'service_whitelist' => array( 'Site.Index', ), ``` 如源代碼里的注釋所示,配置的格式有以下四種。 類型|配置格式|匹配規則|示例及說明 ---|---|---|--- 全部|```*.*```|匹配全部接口服務(慎用!)|如果配置了此規則,即全部的接口服務都不觸發過濾器。 方法通配|```Site.*```|匹配某個類的任何方法|即App\Api\Site接口類的全部方法 類通配|```*.Index```|匹配全部接口類的某個方法|即全部接口類的Index方法 具體匹配|```Site.Index```|匹配指定某個接口服務|即App\Api\Site::Index() 如果有多個生效的規則,按短路判斷原則,即有任何一個白名單規則匹配后就跳過驗證,不觸發過濾器。 以下是更多的示例: ```php 'service_whitelist' => array( '*.Index', // 全部的Index方法 'Test.*', // Api_Test的全部方法 'User.GetBaseInfo', // Api_User::GetBaseInfo()方法 ), ``` 配置好上面的白名單后,以下這些接口服務全部不會觸發過濾器: ``` // 全部的Index方法 ?service=Site.Index ?service=User.Index // Api_Test的全部方法 ?service=Test.DoSth ?service=Test.Hello ?service=Test.GOGOGO // Api_User::GetBaseInfo()方法 ?service=User.GetBaseInfo ``` ### 更好地建議 通常關于接口簽名這塊,我們還需要: + 1、為不同的接入方定義不同的密鑰和私鑰; + 2、如果業務需要,為各個接口、各個接入方分配調用權限; + 3、統一簽名參數的規則,可以配置在./config/app.php中的,如上面的簽名需要的參數,我們可以追加統一的參數規則: ```php /** * 應用接口層的統一參數 */ 'apiCommonRules' => array( 'signature' => array('name' => 'signature', 'require' => true), 'timestamp' => array('name' => 'timestamp', 'require' => true), 'nonce' => array('name' => 'nonce', 'require' => true), ), ``` ## 擴展:實現你的簽名方式 如果我們需要實現簽名驗證,只需要簡單的兩步即可: + 1、實現過濾器接口 **PhalApi\Filter::check()**; + 2、注冊過濾器服務 **PhalApi\DI()->filter**; 下面以大家熟悉的 [微信驗簽](http://mp.weixin.qq.com/wiki/17/2d4265491f12608cd170a95559800f2d.html) 為例,進行示例說明。 ### 實現過濾器接口 通常我們約定返回ret = 402表示驗證失敗,所以當簽名失敗時,我們可以返回ret = 402以告知客戶端簽名不對。根據微信的檢驗signature的PHP示例代碼,我們可以快速實現自定義簽名規則,如: ```php // 文件 ./src/app/Common/SignFilter.php <?php namespace App\Common; use PhalApi\Filter; use PhalApi\Exception\BadRequestException; class SignFilter implements Filter { public function check() { $signature = \PhalApi\DI()->request->get('signature'); $timestamp = \PhalApi\DI()->request->get('timestamp'); $nonce = \PhalApi\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 BadRequestException('wrong sign', 1); } } } ``` ### 注冊過濾器服務 隨后,我們只需要再簡單地注冊一下過濾器服務即可,在```./config/di.php```文件最后追加: ```php // 簽名驗證服務 $di->filter = new App\Common\SignFilter(); ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看