Twitter OAuthのAccess Tokenをリダイレクト無しで取得する方法

Webの画面を持たない自作のTwitterのツールなどは、リダイレクトでAccess Tokenを受け取る事ができません。
この様なケースでは、PIN-based authorizationという仕組みを使用することで、Access Tokenを取得する事ができます。
この記事では、Twitter OAuthのAccess Tokenをリダイレクト無しで取得する方法を解説します。
自作のツールを複数のアカウントで使用したい場合などに活用できると思います。

ちなみに、この先登場するトークン3種類を整理しておくと、
Consumer API Keyアプリ毎に発行されるトークン。
Access Token(アクセストークン)はユーザ毎に発行されるトークン。
リクエストトークンoauth_tokenは、アクセストークン発行リクエストに必要なトークンとなります。

CLIツールを作成しました🎉

解説の前にツールを紹介させて下さい。(仕組みは何でもいいからさっさとアクセストークンが欲しい!という方はこちらをご利用下さい。)
簡単にAccess Tokenを生成できるCLIツールを作成しました。
以下のコマンドで実行できます。
なお、実行するにはdockerが必要です。

docker run --rm -i tkuni83/twitter-oauth-token-resolver

プロンプトに従ってConsumer API KeyPIN codeを入力すれば、Access Tokenが取得できます。

Twitter OAuthのアクセストークンを取得するツールを実行した図

PIN-based authorizationについて

OAuthのプロセスの内、リダイレクト先となる画面を持たないアプリケーションでOAuthを利用するための仕組み。
リダイレクトの替わりにPIN codeが発行される。
詳細はコチラ

PIN-based authorizationを試してみる。

PHPで試してみます。
署名の生成が面倒なのでtwitteroauthというライブラリを使います。
$connection->oauth("oauth/request_token")OAuth認可プロセスを開始します。
oauth_callbackというパラメータにoobを指定する事でPINベースのOAuth認可になります。

$connection       = new TwitterOAuth($apiKey, $apiSecretKey);
$result           = $connection->oauth("oauth/request_token", [
    "oauth_callback" => "oob"
]);
$oauthToken       = $result['oauth_token'];        // リクエストトークン(一時トークン)
$oauthTokenSecret = $result['oauth_token_secret']; // リクエストトークン(一時トークン)シークレット

リクエストトークンを付与したURLを生成&表示してユーザに承認を促します。
遷移先の画面で承認するとPIN codeが発行されます。

$url = "https://api.twitter.com/oauth/authorize?oauth_token=${oauthToken}";

最後に、$connection->oauth("oauth/access_token")PIN codeを渡してAccess Tokenを取得します。

$connection   = new TwitterOAuth($apiKey, $apiSecretKey, $oauthToken, $oauthTokenSecret);
$result = $connection->oauth("oauth/access_token", [
    "oauth_verifier" => $pinCode
]);
$accessToken       = $result['oauth_token'];        // アクセストークン
$accessTokenSecret = $result['oauth_token_secret']; // アクセストークンシークレット

以上です!🤙

コメントする