对象存储

  • 对象存储 > 常见问题 > 上传问题 >七牛回调及回调鉴权

    七牛回调及回调鉴权

    最近更新时间: 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