123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255 |
- <?php
- namespace Qiniu;
- use Qiniu\Http\Header;
- use Qiniu\Zone;
- final class Auth
- {
- private $accessKey;
- private $secretKey;
- public $options;
- public function __construct($accessKey, $secretKey, $options = null)
- {
- $this->accessKey = $accessKey;
- $this->secretKey = $secretKey;
- $defaultOptions = array(
- 'disableQiniuTimestampSignature' => null
- );
- if ($options == null) {
- $options = $defaultOptions;
- }
- $this->options = array_merge($defaultOptions, $options);
- }
- public function getAccessKey()
- {
- return $this->accessKey;
- }
- public function sign($data)
- {
- $hmac = hash_hmac('sha1', $data, $this->secretKey, true);
- return $this->accessKey . ':' . \Qiniu\base64_urlSafeEncode($hmac);
- }
- public function signWithData($data)
- {
- $encodedData = \Qiniu\base64_urlSafeEncode($data);
- return $this->sign($encodedData) . ':' . $encodedData;
- }
- public function signRequest($urlString, $body, $contentType = null)
- {
- $url = parse_url($urlString);
- $data = '';
- if (array_key_exists('path', $url)) {
- $data = $url['path'];
- }
- if (array_key_exists('query', $url)) {
- $data .= '?' . $url['query'];
- }
- $data .= "\n";
- if ($body !== null && $contentType === 'application/x-www-form-urlencoded') {
- $data .= $body;
- }
- return $this->sign($data);
- }
- /**
- * @param string $urlString
- * @param string $method
- * @param string $body
- * @param null|Header $headers
- */
- public function signQiniuAuthorization($urlString, $method = "GET", $body = "", $headers = null)
- {
- $url = parse_url($urlString);
- if (!$url) {
- return array(null, new \Exception("parse_url error"));
- }
- // append method, path and query
- if ($method === "") {
- $data = "GET ";
- } else {
- $data = $method . " ";
- }
- if (isset($url["path"])) {
- $data .= $url["path"];
- }
- if (isset($url["query"])) {
- $data .= "?" . $url["query"];
- }
- // append Host
- $data .= "\n";
- $data .= "Host: ";
- if (isset($url["host"])) {
- $data .= $url["host"];
- }
- if (isset($url["port"]) && $url["port"] > 0) {
- $data .= ":" . $url["port"];
- }
- // try append content type
- if ($headers != null && isset($headers["Content-Type"])) {
- // append content type
- $data .= "\n";
- $data .= "Content-Type: " . $headers["Content-Type"];
- }
- // try append xQiniuHeaders
- if ($headers != null) {
- $headerLines = array();
- $keyPrefix = "X-Qiniu-";
- foreach ($headers as $k => $v) {
- if (strlen($k) > strlen($keyPrefix) && strpos($k, $keyPrefix) === 0) {
- array_push(
- $headerLines,
- $k . ": " . $v
- );
- }
- }
- if (count($headerLines) > 0) {
- $data .= "\n";
- sort($headerLines);
- $data .= implode("\n", $headerLines);
- }
- }
- // append body
- $data .= "\n\n";
- if (!is_null($body)
- && strlen($body) > 0
- && isset($headers["Content-Type"])
- && $headers["Content-Type"] != "application/octet-stream"
- ) {
- $data .= $body;
- }
- return array($this->sign($data), null);
- }
- public function verifyCallback($contentType, $originAuthorization, $url, $body)
- {
- $authorization = 'QBox ' . $this->signRequest($url, $body, $contentType);
- return $originAuthorization === $authorization;
- }
- public function privateDownloadUrl($baseUrl, $expires = 3600)
- {
- $deadline = time() + $expires;
- $pos = strpos($baseUrl, '?');
- if ($pos !== false) {
- $baseUrl .= '&e=';
- } else {
- $baseUrl .= '?e=';
- }
- $baseUrl .= $deadline;
- $token = $this->sign($baseUrl);
- return "$baseUrl&token=$token";
- }
- public function uploadToken($bucket, $key = null, $expires = 3600, $policy = null, $strictPolicy = true)
- {
- $deadline = time() + $expires;
- $scope = $bucket;
- if ($key !== null) {
- $scope .= ':' . $key;
- }
- $args = self::copyPolicy($args, $policy, $strictPolicy);
- $args['scope'] = $scope;
- $args['deadline'] = $deadline;
- $b = json_encode($args);
- return $this->signWithData($b);
- }
- /**
- *上传策略,参数规格详见
- *http://developer.qiniu.com/docs/v6/api/reference/security/put-policy.html
- */
- private static $policyFields = array(
- 'callbackUrl',
- 'callbackBody',
- 'callbackHost',
- 'callbackBodyType',
- 'callbackFetchKey',
- 'returnUrl',
- 'returnBody',
- 'endUser',
- 'saveKey',
- 'forceSaveKey',
- 'insertOnly',
- 'detectMime',
- 'mimeLimit',
- 'fsizeMin',
- 'fsizeLimit',
- 'persistentOps',
- 'persistentNotifyUrl',
- 'persistentPipeline',
- 'deleteAfterDays',
- 'fileType',
- 'isPrefixalScope',
- );
- private static function copyPolicy(&$policy, $originPolicy, $strictPolicy)
- {
- if ($originPolicy === null) {
- return array();
- }
- foreach ($originPolicy as $key => $value) {
- if (!$strictPolicy || in_array((string)$key, self::$policyFields, true)) {
- $policy[$key] = $value;
- }
- }
- return $policy;
- }
- public function authorization($url, $body = null, $contentType = null)
- {
- $authorization = 'QBox ' . $this->signRequest($url, $body, $contentType);
- return array('Authorization' => $authorization);
- }
- public function authorizationV2($url, $method, $body = null, $contentType = null)
- {
- $headers = new Header();
- $result = array();
- if ($contentType != null) {
- $headers['Content-Type'] = $contentType;
- $result['Content-Type'] = $contentType;
- }
- $signDate = gmdate('Ymd\THis\Z', time());
- if ($this->options['disableQiniuTimestampSignature'] !== null) {
- if (!$this->options['disableQiniuTimestampSignature']) {
- $headers['X-Qiniu-Date'] = $signDate;
- $result['X-Qiniu-Date'] = $signDate;
- }
- } elseif (getenv("DISABLE_QINIU_TIMESTAMP_SIGNATURE")) {
- if (strtolower(getenv("DISABLE_QINIU_TIMESTAMP_SIGNATURE")) !== "true") {
- $headers['X-Qiniu-Date'] = $signDate;
- $result['X-Qiniu-Date'] = $signDate;
- }
- } else {
- $headers['X-Qiniu-Date'] = $signDate;
- $result['X-Qiniu-Date'] = $signDate;
- }
- list($sign) = $this->signQiniuAuthorization($url, $method, $body, $headers);
- $result['Authorization'] = 'Qiniu ' . $sign;
- return $result;
- }
- }
|