プログラマー幸福論

プログラム関係の雑記やcodicの開発日誌

Twitter認証を使っているサイトは要注意!-4/6以降、認証が失敗するようになったことへの対策

f:id:namba0219:20120330231514j:plain

今朝、何気にcodicを触っていたら、なぜかTwitter認証を使ったログインが失敗するようになっていて、調べてみるとアクセストークンの取得で失敗している模様。「なぜだー!」と言いながら対策したことをまとめてみます。ちなみに、アクセストークンを事前に取得するボット系のプログラムには影響ありません(たぶん)。

API 1.1の認証系APIの変更点

単に、APIのURLを api.twitter.com/1.1/ に変更すれば良いと思っていた自分が甘かった。ネットをいろいろ検索していたら、Twitter Developerフォーラムでこんな記事を見つけました。この返信の中でこんなことが書かれていました。

  • You must pass an oauth_callback value to oauth/request_token. It's not optional. Even if you have one already set on dev.twitter.com. If you're doing out of band OAuth, pass oauth_callback=oob.
    (和訳)oauth/request_token呼び出し時のoauth_callbackパラメータが必須になったんのじゃー。
  • You must pass along the oauth_verifier you either received from your executed callback or that you received hand-typed by your end user to oauth/access_token.
    (和訳)oauth/access_token呼び出し時のoauth_verifierパラメータが必須になったんのじゃー。
  • Additional reminder: Scraping a PIN code/oauth_verifier from the HTML page that displays it in out of band OAuth is very very uncool.
    (和訳)????

どうやら、今までは任意のパラメータだったものが、必須パラメータに変更になったみたいですね。

対策(twitteroauth)

codicでは、abraham/twitteroauthを使ってTwitter認証を実装しているのですが、以下のように変更しました。基本的にtwitteroauth側は元々これらのパラメータに対応しているため、変更なしで行けます。また、twitteroauthを使っていない場合でも同じような対応になると思います。

1. コールバックURLを指定

Twitterへのリダイレクト時に呼び出している、getRequestToken() のパラメータにコールバックURLを渡すように変更します。コールバックURLは、Twitter Developerでアプリ登録した際にも登録したものと同じものを指定すれば、OKです。

$oAuth = new TwitterOAuth($consumerKey, $consumerSecret);
$requestToken = $oAuth->getRequestToken();

↓変更後

$oAuth = new TwitterOAuth($consumerKey, $consumerSecret);
$requestToken = $oAuth->getRequestToken('http://codic.jp/login/callback');

 

2. アクセストークンの取得

おそらく重要なのがここで、Twitterからのコールバックの処理で、アクセストークンを取得している箇所で、getAccessToken()のパラメータに、GETパラメータから取得した oauth_verifierを指定するように変更します。

$twitter = new TwitterOAuth($consumerKey, $consumerSecret, $_SESSION['oauth_token'], $_SESSION['oauth_token_secret']);
$tokenCredentials = $twitter->getAccessToken();

↓変更後

$twitter = new TwitterOAuth($consumerKey, $consumerSecret, $_SESSION['oauth_token'], $_SESSION['oauth_token_secret']);
$tokenCredentials = $twitter->getAccessToken($_GET['oauth_verifier']);

 

とりあえずこれで動くようになります。実際のところ1のコールバックURLの指定は、対応しなくても動くみたいですが、結局のところ動くか動かないかは、Twitter様のご機嫌次第なので、言われた通り「へいへい」と対応しておく方が無難だと思います。