七牛回调及回调鉴权
概述
客户上传文件到后,服务器会响应 200 状态码,响应内容包括 hash 和 key 。但是如果客户需要自定义响应内容,则可以通过设置回调来实现。
回调实现
客户端需要在上传 token 中设置 callbackurl 和 callbody
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