当前位置:Gxlcms > PHP教程 > 上传文件到七牛时,badtoken了怎么处理?

上传文件到七牛时,badtoken了怎么处理?

时间:2021-07-01 10:21:17 帮助过:85人阅读

想用七牛实现个离线下载的功能。然后把里面的一些加密算法的函数提了出来。
这个是shell脚本运行的,提示bad token了,不知道我下面的脚本哪里写错了?
谢谢~

  1. <code>php download.php https://p.ssl.qhimg.com/t01d1f1a2ae31e3c3e4.png 111.png</code>

download.php,获取encodeURI、encodedEntryURI和accessToken;

  1. <code><!--?php
  2. function urlsafe_base64_encode($data) {
  3. $find = array('+', '/');
  4. $replace = array('-', '_');
  5. return str_replace($find, $replace, base64_encode($data));
  6. }
  7. function hmac_sha1($str, $key) {
  8. return hash_hmac("sha1", $str, $key, true);
  9. }
  10. define("AccessKey", "AccessKey11111");
  11. define("SecretKey", "SecretKey22222");
  12. $url = $argv[1]; //第二个参数是url
  13. $encodeURI = urlsafe_base64_encode($url);
  14. //var_dump(base64_encode($url));
  15. echo "url:{$url}, \r\nencodeURI:\r\n{$encodeURI}\r\n\r\n";
  16. $entry = isset($argv[2]) ? 'optest:'.$argv[2] : "optest";
  17. //$entry = "optest"; //buticket
  18. $encodedEntryURI = urlsafe_base64_encode($entry);
  19. echo "entry:{$entry}, \r\nencodedEntryURI:\r\n{$encodedEntryURI}\r\n\r\n";
  20. $parse = parse_url($url);
  21. $path = $parse['path'];
  22. $query = @$parse['query'];
  23. //$signingStr = "<path-->?<query>\n"
  24. $signingStr = "{$path}?{$query}\n";
  25. $sign = hmac_sha1($signingStr, SecretKey);
  26. $encodedSign = urlsafe_base64_encode($sign);
  27. //$encodeAccessKey = urlsafe_base64_encode(AccessKey);
  28. //$accessToken = "{$encodeAccessKey}:{$encodedSign}";
  29. $accessToken = AccessKey.":{$encodedSign}";
  30. echo "AccessToken:\r\n{$accessToken}\r\n\r\n";
  31. </query></code>
  1. <code>$data['scope'] = BUCKET;
  2. $data['deadline'] = time()+3600;//过期时间
  3. $encoded = urlsafe_base64_encode(json_encode($data));
  4. //$signature=hash_hmac('sha1',$encoded,'KEY',true);
  5. $signature = hmac_sha1($encoded, SecretKey);
  6. $encode_signed = urlsafe_base64_encode($signature);
  7. //$UploadToken=$encode_signed.':'.$encoded;
  8. $UploadToken = AccessKey.":".$encode_signed.":".$encoded;
  9. echo "AccessToken:\r\n{$UploadToken}\r\n\r\n";
  10. echo "UploadURL:\r\nhttp://iovip.qbox.me/fetch/{$encodeURI}/to/{$encodedEntryURI}\r\n\r\n";
  11. </code>

再通过脚本

  1. <code>sh download.sh encodeURI encodedEntryURI accessToken</code>

传输数据,结果。。。提示:

  1. <code>{"error":"bad token"}</code>

download.sh

  1. <code>curl -i \
  2. -o - \
  3. -H 'Content-Type: application/x-www-form-urlencoded' \
  4. -H "Authorization: QBox $3" \
  5. -X POST \
  6. "http://iovip.qbox.me/fetch/$1/to/$2"</code>

已经自行处理完成,最终 PHP 部分(有两处错误):

PS:我发现我提问到最后,基本都是靠自己搞定的啊。不知道是不是大牛不屑这些技术含量低的问题还是???
真的和 sg 没法比啊。。。

  1. <code><!--?php
  2. function urlsafe_base64_encode($data) {
  3. $find = array('+', '/');
  4. $replace = array('-', '_');
  5. return str_replace($find, $replace, base64_encode($data));
  6. }
  7. function hmac_sha1($str, $key) {
  8. return hash_hmac("sha1", $str, $key, true);
  9. }
  10. define("AccessKey", "AccessKey11111");
  11. define("SecretKey", "SecretKey22222");
  12. define("BUCKET", "optest");
  13. $url = $argv[1]; //第二个参数是url
  14. $encodeURI = urlsafe_base64_encode($url);
  15. echo "url:{$url}, \r\nencodeURI:\r\n{$encodeURI}\r\n\r\n";
  16. $entry = isset($argv[2]) ? BUCKET.':'.$argv[2] : BUCKET;
  17. //$entry = "optest"; //buticket
  18. $encodedEntryURI = urlsafe_base64_encode($entry);
  19. echo "entry:{$entry}, \r\nencodedEntryURI:\r\n{$encodedEntryURI}\r\n\r\n";
  20. //是使用这个 path 来取 signingStr 的,官方文档说得不是很清楚。
  21. $path = '/fetch/' . $encodeURI . '/to/' . $encodedEntryURI;
  22. $parse = parse_url($path);
  23. $path = $parse['path'];
  24. $signingStr = isset($parse['query']) ? $path."?".$parse['query']."\n" : $path."\n";
  25. //$signingStr = "{$path}?{$query}\n"; //如果缺省了$parse['query'],那就不需要再带?号了
  26. //$signingStr = "{$path}?{$query}\n<body-->";
  27. var_dump($signingStr);
  28. $sign = hmac_sha1($signingStr, SecretKey);
  29. $encodedSign = urlsafe_base64_encode($sign);
  30. var_dump($sign);
  31. $accessToken = AccessKey.":{$encodedSign}";
  32. echo "AccessToken:\r\n{$accessToken}\r\n\r\n";
  33. echo "UploadURL:\r\nhttp://iovip.qbox.me/fetch/{$encodeURI}/to/{$encodedEntryURI}\r\n\r\n";
  34. </code>

回复内容:

想用七牛实现个离线下载的功能。然后把里面的一些加密算法的函数提了出来。
这个是shell脚本运行的,提示bad token了,不知道我下面的脚本哪里写错了?
谢谢~

  1. <code>php download.php https://p.ssl.qhimg.com/t01d1f1a2ae31e3c3e4.png 111.png</code>

download.php,获取encodeURI、encodedEntryURI和accessToken;

  1. <code><!--?php
  2. function urlsafe_base64_encode($data) {
  3. $find = array('+', '/');
  4. $replace = array('-', '_');
  5. return str_replace($find, $replace, base64_encode($data));
  6. }
  7. function hmac_sha1($str, $key) {
  8. return hash_hmac("sha1", $str, $key, true);
  9. }
  10. define("AccessKey", "AccessKey11111");
  11. define("SecretKey", "SecretKey22222");
  12. $url = $argv[1]; //第二个参数是url
  13. $encodeURI = urlsafe_base64_encode($url);
  14. //var_dump(base64_encode($url));
  15. echo "url:{$url}, \r\nencodeURI:\r\n{$encodeURI}\r\n\r\n";
  16. $entry = isset($argv[2]) ? 'optest:'.$argv[2] : "optest";
  17. //$entry = "optest"; //buticket
  18. $encodedEntryURI = urlsafe_base64_encode($entry);
  19. echo "entry:{$entry}, \r\nencodedEntryURI:\r\n{$encodedEntryURI}\r\n\r\n";
  20. $parse = parse_url($url);
  21. $path = $parse['path'];
  22. $query = @$parse['query'];
  23. //$signingStr = "<path-->?<query>\n"
  24. $signingStr = "{$path}?{$query}\n";
  25. $sign = hmac_sha1($signingStr, SecretKey);
  26. $encodedSign = urlsafe_base64_encode($sign);
  27. //$encodeAccessKey = urlsafe_base64_encode(AccessKey);
  28. //$accessToken = "{$encodeAccessKey}:{$encodedSign}";
  29. $accessToken = AccessKey.":{$encodedSign}";
  30. echo "AccessToken:\r\n{$accessToken}\r\n\r\n";
  31. </query></code>
  1. <code>$data['scope'] = BUCKET;
  2. $data['deadline'] = time()+3600;//过期时间
  3. $encoded = urlsafe_base64_encode(json_encode($data));
  4. //$signature=hash_hmac('sha1',$encoded,'KEY',true);
  5. $signature = hmac_sha1($encoded, SecretKey);
  6. $encode_signed = urlsafe_base64_encode($signature);
  7. //$UploadToken=$encode_signed.':'.$encoded;
  8. $UploadToken = AccessKey.":".$encode_signed.":".$encoded;
  9. echo "AccessToken:\r\n{$UploadToken}\r\n\r\n";
  10. echo "UploadURL:\r\nhttp://iovip.qbox.me/fetch/{$encodeURI}/to/{$encodedEntryURI}\r\n\r\n";
  11. </code>

再通过脚本

  1. <code>sh download.sh encodeURI encodedEntryURI accessToken</code>

传输数据,结果。。。提示:

  1. <code>{"error":"bad token"}</code>

download.sh

  1. <code>curl -i \
  2. -o - \
  3. -H 'Content-Type: application/x-www-form-urlencoded' \
  4. -H "Authorization: QBox $3" \
  5. -X POST \
  6. "http://iovip.qbox.me/fetch/$1/to/$2"</code>

已经自行处理完成,最终 PHP 部分(有两处错误):

PS:我发现我提问到最后,基本都是靠自己搞定的啊。不知道是不是大牛不屑这些技术含量低的问题还是???
真的和 sg 没法比啊。。。

  1. <code><!--?php
  2. function urlsafe_base64_encode($data) {
  3. $find = array('+', '/');
  4. $replace = array('-', '_');
  5. return str_replace($find, $replace, base64_encode($data));
  6. }
  7. function hmac_sha1($str, $key) {
  8. return hash_hmac("sha1", $str, $key, true);
  9. }
  10. define("AccessKey", "AccessKey11111");
  11. define("SecretKey", "SecretKey22222");
  12. define("BUCKET", "optest");
  13. $url = $argv[1]; //第二个参数是url
  14. $encodeURI = urlsafe_base64_encode($url);
  15. echo "url:{$url}, \r\nencodeURI:\r\n{$encodeURI}\r\n\r\n";
  16. $entry = isset($argv[2]) ? BUCKET.':'.$argv[2] : BUCKET;
  17. //$entry = "optest"; //buticket
  18. $encodedEntryURI = urlsafe_base64_encode($entry);
  19. echo "entry:{$entry}, \r\nencodedEntryURI:\r\n{$encodedEntryURI}\r\n\r\n";
  20. //是使用这个 path 来取 signingStr 的,官方文档说得不是很清楚。
  21. $path = '/fetch/' . $encodeURI . '/to/' . $encodedEntryURI;
  22. $parse = parse_url($path);
  23. $path = $parse['path'];
  24. $signingStr = isset($parse['query']) ? $path."?".$parse['query']."\n" : $path."\n";
  25. //$signingStr = "{$path}?{$query}\n"; //如果缺省了$parse['query'],那就不需要再带?号了
  26. //$signingStr = "{$path}?{$query}\n<body-->";
  27. var_dump($signingStr);
  28. $sign = hmac_sha1($signingStr, SecretKey);
  29. $encodedSign = urlsafe_base64_encode($sign);
  30. var_dump($sign);
  31. $accessToken = AccessKey.":{$encodedSign}";
  32. echo "AccessToken:\r\n{$accessToken}\r\n\r\n";
  33. echo "UploadURL:\r\nhttp://iovip.qbox.me/fetch/{$encodeURI}/to/{$encodedEntryURI}\r\n\r\n";
  34. </code>

以前写的个:AK,KEYscope替换成你的

  1. <code>$data['scope']='your bucket';
  2. $data['deadline']=time()+3600;//过期时间
  3. $encoded=urlsafe_base64_encode(json_encode($data));
  4. $signature=hash_hmac('sha1',$encoded,'KEY',true);
  5. $encode_signed = urlsafe_base64_encode($signature);
  6. $UploadToken='AK:'.$encode_signed.':'.$encoded;
  7. echo $UploadToken;
  8. function urlsafe_base64_encode($data) {
  9. $data = base64_encode($data);
  10. $data = str_replace(array('+','/'),array('-','_'),$data);
  11. return $data;
  12. }</code>

话说为啥不用SDK的?
直接

  1. <code>$token = $auth->uploadToken($bucket);</code>

人气教程排行