Ошибка 401 при запросе учетных данных доступа OAuth с использованием Codeigniter - PullRequest
0 голосов
/ 25 января 2012

Итак, я собираю быстрое и грязное приложение для автоматического добавления новых сообщений в Tumblr на основе новых элементов, извлеченных из RSS-канала. Приложение находится в Codeigniter, и до сих пор мне удалось получить учетные данные запроса и отправить пользователя в Tumblr для авторизации. Проблема в том, что, как только они перенаправляются обратно в приложение, и я делаю запрос на учетные данные доступа, я получаю следующую ошибку:

Message: file_get_contents(http://www.tumblr.com/oauth/access_token?oauth_consumer_key=THECONSUMERKEY&oauth_nonce=9362afdd34f9ce1601fb9cf505ffa3cf&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1327440390&oauth_token=09mFsxCvsODDmSxPCyQNu4QKFMMXaAEEyPtBibPUyUTE1n2BsJ&oauth_verifier=hDfGgesf9EKIO5yFhiHxtnsbP42XEP1FISY2qyyWerzXf6fPTG&oauth_version=1.0&oauth_signature=yeFw8ACvVvKtD%2BQ%2FdzbLivDSm1Y%3D) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 401 Unauthorized

Вот код, который я использую:

$oauthVerifier = $_GET["oauth_verifier"];
        $sigBase = "GET&" . rawurlencode($this->accessTokenUrl) . "&"
                . rawurlencode("oauth_consumer_key=" . rawurlencode($this->consumerKey)
                        . "&oauth_nonce=" . rawurlencode($this->nonce)
                        . "&oauth_signature_method=" . rawurlencode($this->oauthSignatureMethod)
                        . "&oauth_timestamp=" . $this->oauthTimestamp
                        . "&oauth_token=" . rawurlencode($this->CI->session->userdata('requestToken'))
                        . "&oauth_verifier=" . rawurlencode($oauthVerifier)
                        . "&oauth_version=" . $this->oauthVersion);
        $sigKey = $this->consumerSecret . "&";
        $oauthSig = base64_encode(hash_hmac("sha1", $sigBase, $sigKey, true));

        $requestUrl = $this->accessTokenUrl . "?"
                . "oauth_consumer_key=" . rawurlencode($this->consumerKey)
                . "&oauth_nonce=" . rawurlencode($this->nonce)
                . "&oauth_signature_method=" . rawurlencode($this->oauthSignatureMethod)
                . "&oauth_timestamp=" . rawurlencode($this->oauthTimestamp)
                . "&oauth_token=" . rawurlencode($this->CI->session->userdata('requestToken'))
                . "&oauth_verifier=" . rawurlencode($oauthVerifier)
                . "&oauth_version=" . rawurlencode($this->oauthVersion)
                . "&oauth_signature=" . rawurlencode($oauthSig);

        $response = file_get_contents($requestUrl);

Какие-нибудь яркие идеи?

Ответы [ 2 ]

1 голос
/ 25 января 2012

Это неполно и требует от вас погони за ошибкой.

Понимаете ли вы соответствующую часть разговора:

TumApp to user: please go to Tumblr with one of my request tokens: GHF3F4F

user to Tumblr: I authorize TumApp, and here is it's request token: GHF3F4F

Tumblr to itself: let me authorize GHF3F4F, which TumApp can exchange for an access token
       to user: redirect to Tumapp's callback

Tumapp to itself: Great, user authorized me (by requesting my callback). Let me exchange my request token for an access token
       to Tumblr: Hey, give me an access token for GHF3F4F

Tumblr to Tumapp: Epic 401 fail!

Вот причины, по которым Tumblr выдаст 401

С http://oauth.net/core/1.0a/#http_codes

HTTP 401 Unauthorized
    Invalid Consumer Key
    Invalid / expired Token
    Invalid signature
    Invalid / used nonce

Я бы вывел, начиная с токена; ключ потребителя успешно получил токен запроса, а подпись и одноразовый номер сгенерированы библиотекой.

0 голосов
/ 25 января 2012

ОБНОВЛЕНИЕ : Бродячий амперсанд на самом деле не был в исходном коде (мой плохой), но кое-что я сделал потом, пытаясь это исправить. Фактически, причиной первоначальной проблемы было отсутствие секретного ключа запроса в ключе подписи.

Спасибо за указатели, айтчню - в конце концов проблема была в бродячем амперсанде. В базе подписей я обернул амперсанд перед "oauth_consumer_key =" в rawurlencode, когда он должен был предшествовать.

Вот старая база сигов:

"GET&" . rawurlencode($this->accessTokenUrl)
                . rawurlencode("&oauth_consumer_key=" . rawurlencode($this->consumerKey)
                        . "&oauth_nonce=" . rawurlencode($this->nonce)
                        . "&oauth_signature_method=" . rawurlencode($this->oauthSignatureMethod)
                        . "&oauth_timestamp=" . rawurlencode($this->time)
                        . "&oauth_token=" . rawurlencode($token)
                        . "&oauth_verifier=" . rawurlencode($oauthVerifier)
                        . "&oauth_version=" . $this->oauthVersion);

Новый:

"GET&" . rawurlencode($this->accessTokenUrl) . "&"
                . rawurlencode("oauth_consumer_key=" . rawurlencode($this->consumerKey)
                        . "&oauth_nonce=" . rawurlencode($this->nonce)
                        . "&oauth_signature_method=" . rawurlencode($this->oauthSignatureMethod)
                        . "&oauth_timestamp=" . rawurlencode($this->time)
                        . "&oauth_token=" . rawurlencode($token)
                        . "&oauth_verifier=" . rawurlencode($oauthVerifier)
                        . "&oauth_version=" . $this->oauthVersion);

Жизненная разница!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...