2014-10-21 5 views
2

Я пробовал использовать Net::Twitter::Role::OAuth, чтобы добавить Sign in with Twitter в мое приложение.401 Требуется авторизация: не удалось проверить подпись и токен oauth

Я использовал это успешно в прошлом, но не с поддержкой SSL, который, по-видимому, теперь требуется API-интерфейсом Twitter. У меня есть действие контроллера, очень похожее на примеры, приведенные в кратком обзоре:

sub twitter_authorize : Local { 
    my($self, $c) = @_; 

    my $nt = Net::Twitter->new(traits => [qw/API::RESTv1_1 OAuth/], %param); 
    my $url = $nt->get_authorization_url(callback => $callbackurl); 

    $c->response->cookies->{oauth} = { 
     value => { 
      token => $nt->request_token, 
      token_secret => $nt->request_token_secret, 
     }, 
    }; 

    $c->response->redirect($url); 
} 

Тем не менее, это терпит неудачу на $nt->get_authorization_url() вызова с 401 Несанкционированной ошибкой.

Глядя на oauth/request_token документы, я попытался запустить запрос через CURL, следующим образом:

curl --request 'POST' 'https://api.twitter.com/oauth/request_token' --header 'Authorization: OAuth oauth_consumer_key="xxxx", oauth_nonce="xxxx", oauth_signature="xxxx", oauth_signature_method="HMAC-SHA1", oauth_timestamp="xxxx", oauth_callback="oob", oauth_version="1.0"' --verbose 

И ответ выглядит следующим образом:

* About to connect() to api.twitter.com port 443 (#0) 
* Trying 199.16.156.104... 

connected 
* Connected to api.twitter.com (199.16.156.104) port 443 (#0) 
* successfully set certificate verify locations: 
* CAfile: none 
    CApath: /etc/ssl/certs 
* SSLv3, TLS handshake, Client hello (1): 
* SSLv3, TLS handshake, Server hello (2): 
* SSLv3, TLS handshake, CERT (11): 
* SSLv3, TLS handshake, Server finished (14): 
* SSLv3, TLS handshake, Client key exchange (16): 
* SSLv3, TLS change cipher, Client hello (1): 
* SSLv3, TLS handshake, Finished (20): 
* SSLv3, TLS change cipher, Client hello (1): 
* SSLv3, TLS handshake, Finished (20): 
* SSL connection using AES128-SHA 
* Server certificate: 
* subject: C=US; ST=California; L=San Francisco; O=Twitter, Inc.; OU=Twitter Security; CN=api.twitter.com 
* start date: 2014-08-03 00:00:00 GMT 
* expire date: 2016-12-31 23:59:59 GMT 
* subjectAltName: api.twitter.com matched 
* issuer: C=US; O=VeriSign, Inc.; OU=VeriSign Trust Network; OU=Terms of use at https://www.verisign.com/rpa (c)10; CN=VeriSign Class 3 Secure Server CA - G3 
* SSL certificate verify ok. 
> POST /oauth/request_token HTTP/1.1 
> User-Agent: curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15 
> Host: api.twitter.com 
> Accept: */* 
> Authorization: OAuth oauth_consumer_key="xxxx", oauth_nonce="xxxx", oauth_signature="xxxx", oauth_signature_method="HMAC-SHA1", oauth_timestamp="xxxx", oauth_callback="oob", oauth_version="1.0" 
> 
< HTTP/1.1 401 Authorization Required 
< cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0 
< content-length: 44 
< content-security-policy-report-only: default-src https:; connect-src https:; font-src https: data:; frame-src https: http://*.twimg.com http://itunes.apple.com about: javascript:; img-src https: data:; media-src https:; object-src https:; script-src 'unsafe-inline' 'unsafe-eval' about: https:; style-src 'unsafe-inline' https:; report-uri https://twitter.com/i/csp_report?a=NVXW433SMFUWY%3D%3D%3D&ro=true; 
< content-type: text/html; charset=utf-8 
< date: Tue, 21 Oct 2014 10:29:57 UTC 
< expires: Tue, 31 Mar 1981 05:00:00 GMT 
< last-modified: Tue, 21 Oct 2014 10:29:57 GMT 
< pragma: no-cache 
< server: tsa_b 
< set-cookie: _twitter_sess=BAh7CDoPY3JlYXRlZF9hdGwrCD2PQTJJAToHaWQiJTE3M2Q4OWIyZWE1Nzc1%250AZmYxMjRkYmUyZDVjOTBlYjQxIgpmbGFzaElDOidBY3Rpb25Db250cm9sbGVy%250AOjpGbGFzaDo6Rmxhc2hIYXNoewAGOgpAdXNlZHsA--b807e4ebb8d45756e9686971b951a549d0d83b61; domain=.twitter.com; path=/; secure; HttpOnly 
< set-cookie: guest_id=v1%3A141388739758201626; Domain=.twitter.com; Path=/; Expires=Thu, 20-Oct-2016 10:29:57 UTC 
< status: 401 Unauthorized 
< strict-transport-security: max-age=631138519 
< vary: Accept-Encoding 
< x-connection-hash: 54a185631d5f0b3a3a9dc46fe1f40a57 
< x-content-type-options: nosniff 
< x-frame-options: SAMEORIGIN 
< x-mid: 0258025664ce095129d0cc294100d71a2e6e66ac 
< x-runtime: 0.01294 
< x-transaction: 6fad295009a89877 
< x-ua-compatible: IE=edge,chrome=1 
< x-xss-protection: 1; mode=block 
< 
* Connection #0 to host api.twitter.com left intact 
* Closing connection #0 
* SSLv3, TLS alert, Client hello (1): 
Failed to validate oauth signature and token 

Жутко, если удалить ключ oauth_callback из заголовка авторизации он отлично работает, и я получаю токены. Однако документы API предлагают, что этот параметр необходим. Что-то не так с тем, как я прохожу в пункте oauth_callback?

Я пробовал установить его на oob (который должен работать для доступа «вне диапазона»). И я скопировал закодированный URL из документов API. Это не сработает.

Поскольку это работает без oauth_callback, это не проблема времени на моей машине, как обычно сообщается о проблеме. Я не пробовал отправлять запрос Net :: Twitter без обратного вызова (я не проверял, возможно ли это), но я предполагаю, что это тоже исправит. Тем не менее, мне действительно нужен запрос, чтобы иметь действительный URL-адрес обратного вызова, или пользователь не будет перенаправлен обратно в приложение для остальной части входного потока.

ответ

1

Адам,

У меня была аналогичная проблема, и после тщательного расследования того, что другие библиотеки API-оболочки Twitter делают обнаружили, что oauth_callback нужно быть закодированы дважды.

Выполнение ретроспективы? поиск, чтобы получить немного больше объяснений/ясности. Я нашел следующий ответ SO Twitter Oauth URL encoding inconsistencies?, который чрезвычайно кратко объяснил проблему, которую я имел.

Возможно, это проблема, с которой вы столкнулись?

+0

Спасибо за ваш отзыв. Я запустил вход в Twitter и работал над некоторыми другими провайдерами, поскольку я не мог понять это. Я вернусь к этому скоро и проверю кодировку. –

Смежные вопросы