七牛回调及回调鉴权
概述
客户上传文件到后,服务器会响应 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