Home > Article > Backend Development > 七牛私有空间资源访问时会时不时的出现401授权错误,同一个资源有时候能访问,有时候不能访问
具体情况是:
某一个页面我需要从七牛私有空间请求三张证书图片资源,本地数据库中我存放的是这些证书的名称,在后台代码中我根据文件名来依次生成这些证书可以访问的私有链接地址,前端用的AngularJS框架,后台代码如下:
<code>$coach_cert = new coach_cert (); $results = $coach_cert->listCerts ( $this->coach_id ); //七牛空间密钥 $accessKey = ''; $secretKey = ''; // 私有空间名称 $bucket = ''; // 时间戳生成 $now = time (); $date = $now + 60; // 下载凭证生成 foreach ( $results as &$result ) { $download_url = "http://" . $bucket . ".7xnhmh.com2.z0.glb.qiniucdn.com/" .$result ['filename']. "?e=" . $date; $sign = hash_hmac ( "sha1", $download_url, $secretKey, true ); $encodedSign = base64_encode ( $sign ); $token = $accessKey . ":" . $encodedSign; $realdownloadurl = $download_url . "&token=" . $token; $result ['filename'] = $realdownloadurl; } return [ 'certs' => $results ];</code>
现在的问题是:点击查看三张证书,有时候三张证书全部能加载出来,有时候只能加载部分,不能加载的在控制台报401授权失败的错误:error: "download token auth failed"
具体情况是:
某一个页面我需要从七牛私有空间请求三张证书图片资源,本地数据库中我存放的是这些证书的名称,在后台代码中我根据文件名来依次生成这些证书可以访问的私有链接地址,前端用的AngularJS框架,后台代码如下:
<code>$coach_cert = new coach_cert (); $results = $coach_cert->listCerts ( $this->coach_id ); //七牛空间密钥 $accessKey = ''; $secretKey = ''; // 私有空间名称 $bucket = ''; // 时间戳生成 $now = time (); $date = $now + 60; // 下载凭证生成 foreach ( $results as &$result ) { $download_url = "http://" . $bucket . ".7xnhmh.com2.z0.glb.qiniucdn.com/" .$result ['filename']. "?e=" . $date; $sign = hash_hmac ( "sha1", $download_url, $secretKey, true ); $encodedSign = base64_encode ( $sign ); $token = $accessKey . ":" . $encodedSign; $realdownloadurl = $download_url . "&token=" . $token; $result ['filename'] = $realdownloadurl; } return [ 'certs' => $results ];</code>
现在的问题是:点击查看三张证书,有时候三张证书全部能加载出来,有时候只能加载部分,不能加载的在控制台报401授权失败的错误:error: "download token auth failed"
您的签名有问题,我们是使用safebase64编码,你可以参考我们的源码
https://github.com/qiniu/php-sdk/blob/a864511adb2e50b2b0f080440e6f11d6989905ec/src/Qiniu/functions.php
URL 安全的 Base64 编码适用于以 URL 方式传递 Base64 编码结果的场景。该编码方式的基本过程是先将内容以 Base64 格式编码为字符串,然后检查该结果字符串,将字符串中的加号+换成中划线-,并且将斜杠/换成下划线_,同时尾部保持填充等号=。
/**
对提供的数据进行 urlsafe 的 base64 编码。
*
@param string $data 待编码的数据,一般为字符串
*
@return string 编码后的字符串
@link http://developer.qiniu.com/docs/v6/api/overview/appendix.html#urlsafe-base64
*/
base64_urlSafeEncode($data)
{
<code> $find = array('+', '/'); $replace = array('-', '_'); return str_replace($find, $replace, base64_encode($data));</code>
}
/**