七牛回调及回调鉴权

最近更新时间: 2020-09-11 17:52:55

概述

客户上传文件到后,服务器会响应 200 状态码,响应内容包括 hash 和 key 。但是如果客户需要自定义响应内容,则可以通过设置回调来实现。

回调实现

客户端需要在上传 token 中设置 callbackurlcallbody

1、callbackurl 必须是公网上可正常进行 POST 请求并能正常响应的 url,并且业务服务器返回给的内容必须是 json 串.

这里给一个最简单的能响应200的php代码(获取 callbackbody 并打印一个字符串给客户端)

<?php   
$notifyBody = file_get_contents('php://input');   
file_put_contents("test.txt",$notifyBody);   
$arr=array("date"=>"test");   
echo json_ encode($arr);   
?>

2、callbackbody 是需要向业务服务器发送的回调内容,需使用的魔法变量或自定义变量来填充。
但是格式一定要正确,否则会报400格式错误.

例如 java 中正确的格式:

auth.uploadToken(bucket,key,3600,new StringMap()   
.put("callbackUrl","callbackurl")   
.put("callbackBody", "{"filename":$(fname),"filesize":$(fsize),"width":$(imageInfo.width)}") );

3、callbodytype 默认是 application/x-www-form-urlencoded, 也可在上传策略中设置为 application/json

回调鉴权

因为回调地址是公网可访问的,任何一台服务器都可以对其发起回调,如何确认回调是来自的呢?

在发起回调请求时会在请求头中带上 Authorization 字段,

Authorization:QBox iN7NgwM31j4-BZacMjPrOQBs34UG1maYCAQmhdCV:tDK-3f5xF3SJYEAwsll5g= 

其中 QBox 为固定值,iN7Ngw...dCV 为用户的 Accesskey,tDK-3f...5g= 为签名结果 encoded_data。

业务服务器可以通过多种方法来对其进行验证, 例如如下面的代码php来进行验证:

    <?php
      require_once __DIR__ . '/../autoload.php';
      use Qiniu\Auth;
      $accessKey = getenv('QINIU_ACCESS_KEY');
      $secretKey = getenv('QINIU_SECRET_KEY');
      $bucket = getenv('QINIU_TEST_BUCKET');
      $auth = new Auth($accessKey, $secretKey);
      //获取回调的body信息
      $callbackBody = file_get_contents('php://input');
      //回调的contentType
      $contentType = 'application/x-www-form-urlencoded';
      //回调的签名信息,可以验证该回调是否来自存储服务
      $authorization = $_SERVER['HTTP_AUTHORIZATION'];
      //回调url
      $url = 'http://172.30.251.210/upload_verify_callback.php';
      $isQiniuCallback = $auth->verifyCallback($contentType, $authorization, $url, $callbackBody);
      if ($isQiniuCallback) {
          $resp = array('ret' => 'success');
      } else {
          $resp = array('ret' => 'failed');
      }
      echo json_encode($resp);

回调常见错误

1、400错误

这个是上传时表单格式错误,例如 callbackbody 设置的格式有问题等

2、579错误

1、上传成功回调失败,可以自己先用curl来验证callbackurl是否能成功响应200

curl -X POST -d "name=123.jpg" http://url  

2、业务服务器返回给的 body 不是合法的 json 串
报错信息:{"error":"unexcepted response"}
这时可通过抓包,获取返回给客户端的 body ,通过 http://jsonlint.com 验证是否回调的 body 为合法的 json 串

3、业务服务器拒绝的回调请求
解决方案是配置允许的回调UA的访问。 回调UA:qiniu-callback/1.0

以上内容是否对您有帮助?
  • Qvm free helper
    Close