getAccessToken()が突然の死

…ではなく、突然の仕様変更!!
だったみたいです。もっと言うと仕様変更というか、元々推奨してた仕様に固定されたというか。

何が起きたの?

今朝6時台頃から、急にiconDecotterにログイン出来なくなっていたようです。挙動を見るかぎり、Twitter認証ページに行き、認証を通り、コールバックしてくるところまでは正常、しかしその後ログイン後のページに遷移できていないという状況でした。

色々探ってみると、どうやらアクセストークンを取得する段階で、oauth_token、oauth_token_secretが返って来ていなかったようでした。

oauth/access_tokenのレスポンスが、”Invalid / expired Token”を返すのみになっており、これは何か障害でも起きていたのかと最初は思ったのですが、他の連携サイトを見るに上手くいってるところもあればいってないところもありまちまちだったので、やはり何かスクリプト側に原因があったのではと更に追求したところ、やはり記述の誤りでした。

twitteroauthライブラリの解説記事について

以前書きましたが、iconDecotterもtwitteroauthライブラリを使用しています。今回の一件でこのライブラリを色々と見回しましたが、特に問題はなさそうでしたし、TwitterAPI1.1の件についてはクリアしていたはずなので、かなり首を捻りましたが、原因はライブラリではなく、ライブラリを使うコールバック側のスクリプトでした。

このtwitteroauthライブラリで、アクセストークンを取得するメソッドが「getAccessToken」というものなのですが、今朝まではこんな記述でした。

$to = new TwitterOAuth($consumer_key, $consumer_secret, $_SESSION['oauth_request_token'], $_SESSION['oauth_request_token_secret']);

$tok = $to->getAccessToken();

このgetAccessTokenで、各ユーザーはアクセストークンを取得するのですが、そこがInvalidであったと。
ここなんですが、実はライブラリ本家のコールバックphpスクリプトを見ると、このようになっていたのですね。

/* Request access tokens from twitter */
$access_token = $connection->getAccessToken($_REQUEST['oauth_verifier']);

oauth_verifierを引数に入れてあります。
oauth_verifierは、Twitterの認証ページからコールバックURLに戻ってくる際に、GETで渡されるパラメータで、ユーザーがそのページを認証したことの印です。
本家に倣って、iconDecotter側のスクリプトもgetAccessTokenに上記パラメータを渡すようにしたところ、正常にログイン出来るようになりました。

ということで、今日TwitterAPIにあった変更は、このoauth/access_tokenリクエストパラメータにoauth_verifierが無いものはInvaildとする、というものだったようです。

いくつか障害が起きていたサイトがあったのは、このtwitteroauthライブラリの利用にあたっての解説サイトのなかに、アクセストークンの取得を「getAccessToken()」と記述している所が何箇所かあり、それらを参考にしていたからではと思います。(というかうちもそうです)

長いことそれで問題なかったようですが、TwitterAPI1.0廃止に向けてなのか、本日そのあたりも修正されたということのようです。公式アカウントなどでは何のアナウンスもありませんでしたが…。

ともあれ、ちゃんとライブラリ本家のサンプル通りにコールバック部分も作っておけば、何も問題なかったという事案でした。

コメント

タイトルとURLをコピーしました