TwitterAPI
StreamingAPI
401
ntpd

Twitter Streaming API の401エラーでハマったお話

More than 1 year has passed since last update.

個人で運営してるTwitter Streaming APIを使ったサービスで、突然401エラーが出るようになった。

原因がわからず結構ハマってしまったので、共有のために書いておく。

エラー内容

$ curl --request 'POST' 'https://stream.twitter.com/1.1/statuses/filter.json' --data 'track=twitter' --header 'Authorization: OAuth oauth_consumer_key="XXXXXXXXX", oauth_nonce="XXXXXXXXX", oauth_signature="XXXXXXXXX", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1458266283", oauth_token="XXXXXXXXX", oauth_version="1.0"' --verbose
* About to connect() to stream.twitter.com port 443 (#0)
*   Trying 199.59.148.138... connected
* Connected to stream.twitter.com (199.59.148.138) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
*   CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none
* SSL connection using TLS_RSA_WITH_AES_128_CBC_SHA
* Server certificate:
*   subject: CN=stream.twitter.com,OU=Twitter Security,O="Twitter, Inc.",L=San Francisco,ST=California,C=US
*   start date:  4月 09 00:00:00 2014 GMT
*   expire date: 12月 30 23:59:59 2016 GMT
*   common name: stream.twitter.com
*   issuer: CN=VeriSign Class 3 Secure Server CA - G3,OU=Terms of use at https://www.verisign.com/rpa (c)10,OU=VeriSign Trust Network,O="VeriSign, Inc.",C=US
> POST /1.1/statuses/filter.json HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.19.1 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: stream.twitter.com
> Accept: */*
> Authorization: OAuth oauth_consumer_key="XXXXXXXXX", oauth_nonce="XXXXXXXXX", oauth_signature="XXXXXXXXX", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1458266283", oauth_token="XXXXXXXXX", oauth_version="1.0"
> Content-Length: 13
> Content-Type: application/x-www-form-urlencoded
> 
< HTTP/1.1 401 Authorization Required
< cache-control: must-revalidate,no-cache,no-store
< connection: close
< content-length: 266
< content-type: text/html
< date: Fri, 18 Mar 2016 03:46:08 GMT
< server: tsa
< www-authenticate: OAuth realm="Firehose"
< x-connection-hash: 0bd058f2a8d6f55b19b3db5285ac134e
< 
<html>\n<head>\n<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>\n<title>Error 401 Unauthorized</title>
</head>
<body>
<h2>HTTP ERROR: 401</h2>
<p>Problem accessing '/1.1/statuses/filter.json'. Reason:
<pre>    Unauthorized</pre>
</body>
</html>
* Closing connection #0

状況

・アカウントが有効かどうかをチェックする https://api.twitter.com/1.1/account/verify_credentials のAPIは成功するので認証自体が失敗してるわけではない。

・REST APIは成功する。

・しかし、Streaming APIに関してはfilter.jsonもsample.jsonも401エラーで失敗する。

・ローカル環境では、filter.jsonもsample.jsonも成功する。

・サーバーのOpenSSL更新したのでそれが原因かと思って使用してるライブラリのCA用証明書を更新するも意味なし

原因

http://stackoverflow.com/questions/20594173/twitter-streaming-api-401-unauthorized

If you're on Linux, sync your time with an NTP server

サーバーのNTPサーバーが止まってた。。

さくらVPSのハードウェア入れ替えでNTPサーバーが停止する可能性があるってメール着てたのに完全に忘れてた。。

認証に使う時間がおかしなことになってたから401エラーがきてたっぽい

解決

 # /sbin/service ntpd restart