Как создать заголовок авторизации Twitter для получения вложений из DM? - PullRequest
0 голосов
/ 24 марта 2019

Я хочу иметь возможность открывать вложения из своего почтового ящика по прямой ссылке. Поэтому я пытаюсь сгенерировать заголовок OAuth в Твиттере, соблюдая docs https://developer.twitter.com/en/docs/direct-messages/message-attachments/guides/retrieving-media.html,, но ответ всегда 401 Unathorized, и я не знаю почему.

Я сделал все шаги из документации с полной точностью, перепроверил. Все должно работать, но это не так, и я понятия не имею, почему. Каждый ответ, который я получил от Twitter, имеет http-код 401. Жетоны абсолютно верны.

Это не дубликат: я уже проверял подобные вопросы, код из него не работает, даже если я копирую и вставляю. Я также не могу использовать библиотеку Авраама в Twitteroauth, поскольку она поддерживает только конечные точки API и OAuth, а не прямые медиа-ссылки.

Здесь функция, которая создает заголовок авторизации. Вы можете увидеть полный код здесь: https://pastebin.com/yBEVW9KN

<?php

function getAuthorizationHeader(string $url)
{
    $params = array(
        "oauth_consumer_key" => $this->consumer_key,
        "oauth_nonce" => $this->getNonce(),
        "oauth_signature_method" => "HMAC-SHA1",
        "oauth_timestamp" => time(),
        "oauth_token" => $this->access_token,
        "oauth_version" => "1.0",
    );

    // Step 1. Percent encode.
    $_temp = [];
    foreach ($params as $key => $value) {
        $_temp[rawurlencode($key)] = rawurlencode($value);
    }
    $params = $_temp;

    // Step 2. Sort.
    ksort($params);

    // Step 3. Build DST
    $dst = '';
    foreach ($params as $key => $value) {
        $dst .= $key . '=' . $value . '&';
    }
    $dst = rtrim($dst, '&');

    // Step 4. Creating signature base string
    $baseString = 'GET' . '&' . rawurlencode($url) . '&' . rawurlencode($dst);

    // Step 5. Generating signature key
    $signingKey = rawurlencode($this->consumer_secret) . '&' . rawurlencode($this->access_token_secret);

    // Step 6. Finally, signature.
    $signature = base64_encode(hash_hmac('sha1', $baseString, $signingKey, true));

    // Step 7. Build header string.
    $header[] = 'authorization: ';
    $header[] = 'OAuth ';

    // Maybe ordering important as well?
    $header[] = 'oauth_consumer_key="' . $params['oauth_consumer_key'] . '",';
    $header[] = 'oauth_nonce="' . $params['oauth_nonce'] . '",';
    $header[] = 'oauth_signature="' . $signature . '",';
    $header[] = 'oauth_signature_method="' . $params['oauth_signature_method'] . '",';
    $header[] = 'oauth_timestamp="' . $params['oauth_timestamp'] . '",';
    $header[] = 'oauth_token="' . $params['oauth_token'] . '",';
    $header[] = 'oauth_version="' . $params['oauth_version'] . '"';

    return implode('', $header);
}

...