PHPでのTwitterOAuthの使い方と流れ(ログインの変わりに使う方法)

since : 2013-11-08 10:20:28 コメント(80)

  • このエントリーをはてなブックマークに追加

2015年版のTwitterOAuthの新しい仕様に合わせて記事を書きましたので、こちらをご覧ください。
新 PHPでのTwitterOAuthの使い方と流れ(ログインの変わりに使う方法)






最近のWebサービスには、ログインの時にFacebookやTwitterのアカウントを使用してログインするものが増えてきました。ユーザーはIDやらパスワードやらを入力しないでログインでき、面倒な手間が省けました。

今回はこのTwitterの自動認証に利用するAPI、「TwitterOAuth」の説明をします。
TwitterOAuthのダウンロードはコチラ
https://github.com/abraham/twitteroauth

まずはダウンロードした内容を理解し、それぞれのサイトでカスタマイズしてください。


TwitterOAuthの予備知識

まずはTwitterOAuthを使用するにあたっての予備知識を確認しましょう。

TwitterOAuthを使用するとどんな事ができるのでしょうか?

■まずは最初に書きましたが、サイトのログインに使用できます。これは、TwitterOAuthを使ってログインすると、TwitterからユーザーごとにIDのようなユニークな値が発行されるのですが、そのIDを元にユーザーを識別できるからです。だからアナタのサイトでも、このIDを保存しておく事が必要になります。

■また、ログインしたユーザーのTwitter情報を利用できるようになります。つまり、ログインしてきたユーザーがアナタのサイトからつぶやきができたり、フォローできたり、フォロー解除ができたりします。

何はともあれ、TwitterOAuthの挙動を確認しましょう。

サンプルの認証画面を設置したので、Twitterアカウントを持っている方はこちらから動きを確認してみてください(「sign in with twitter」をクリックしてください)。
サンプル認証
連携アプリを認証をクリックしてもTwitterアカウント情報が表示されない場合は、もう一度「sign in with twitter」をクリックしてください。

アナタのつぶやきが配列で表示されましたでしょうか?


紛らわしい3つのキーと鍵

TwitterOAuthを利用して、最初につまずくのが「なんちゃらトークン」やら「なんちゃらシークレット」なんてのがいくつか出てきて、これらの意味と利用法で混乱する事だと思います。

なのでこれらの説明をしていきましょう。

覚えるのは以下の3セットです。
  • コンシューマキー、コンシューマシークレット
  • リクエストトークン、リクエストシークレット
  • アクセストークン、アクセスシークレット

■まずはコンシューマキー、コンシューマシークレット
アプリケーション(サイト)に割り振られたキーと鍵。これはTwitterのDeveloperページでアプリケーションを登録して発行される、アプリケーションを特定するキーと鍵です。

■次にリクエストトークン、リクエストシークレット
Twitterの認証画面へ飛ぶ直前に取得します。クッキーなどに保存しておき、Twitterの認証画面で認証が完了した後、ユーザーがサイトに戻ってきた時に照合します。つまりサイトに戻ってきたユーザーが、先ほどのユーザーなのかを確認するもので、認証するごとに値が変わっていきます。

■最後にアクセストークン、アクセスシークレット
サイトにおいてユーザーを特定するキーと鍵で、Twitterの認証が完了した後に発行され、毎回同じ文字列になります。Twitterの情報(つぶやきの内容やフォロー数など)を取得する際に使います。また、サイトのログインにTwitter認証を使う場合はDBなどに保存して、新規ユーザーなのか既存ユーザーなのかを判別するのに使用できます。


TwitterOAuthの流れ

それでは、ダウンロードしたTwitterOAuthについて、どのように処理されていくかを説明していきたいと思います。
重要なファイル、フォルダーは以下のものです。(2013.11.6時点)
twitteroauthファイル
→このAPIのコア部分。

config.php
→コンシューマキー、コンシューマシークレット、callback.phpのURLを設定。
ファイル名がconfig-sample.phpとなっている場合は、config.phpに変更しておいてください。

connect.php
→Twitter認証前の最初の画面。

redirect.php
リクエストトークン、リクエストシークレットを取得。Twitter認証ページのURLを作成し、リダイレクトする。

callback.php
→Twitter認証画面から戻って来た時にアクセスするファイル。アクセストークン、アクセスシークレットを取得。callback.phpのURLをconfig.phpに設定しておく必要がある。

④(①?)index.php
→Twitter認証が完了したあとの最終的な画面。

clearsessions.php
→セッションをクリアする処理。ログアウトや、エラーの時に使用。

html.inc
→各ページ共通のHTML部分。


※数字は処理する順番です。


具体的な流れはこうです。

④(①?)まずはindex.phpから処理開始です…が、すぐに①のconnect.phpにリダイレクトします。これは、アクセストークン、アクセスシークレットを取得してない場合はclearsessions.phpでセッションを削除したのちにconnect.phpにリダイレクトする処理になっているからです。


①次にconnect.phpでの処理ですが、このページはリンクが1つあるだけの単純なものです。そしてこのリンク先はredirect.phpになります。


redirect.phpに飛ぶと、ようやくそれらしい処理が始まります。ここでは、config.phpで設定したコンシューマキー、コンシューマシークレット、callback.phpのパスを使って、リクエストトークン、リクエストシークレットを取得。更にリクエストトークンを使ってTwitterの認証画面URLを生成し、そのままTwitter認証画面へリダイレクトします。

redirect.php
/* Start session and load library. */
session_start();
require_once('twitteroauth/twitteroauth.php');
require_once('config.php');

/* Build TwitterOAuth object with client credentials. */
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET);

/* Get temporary credentials. */
$request_token = $connection->getRequestToken(OAUTH_CALLBACK);
7行目でコンシューマキー、コンシューマシークレットを使ってTwitterOAuthを生成し、10行目でリクエストトークンを取得しています。この$request_tokenは連想配列になっていて、「oauth_token」と「oauth_token_secret」で取得していますが、この連想配列のキーの名称が紛らわしいんです…。

redirect.php
/* If last connection failed don't display authorization link. */
switch ($connection->http_code) {
	case 200:
		/* Build authorize URL and redirect user to Twitter. */
		$url = $connection->getAuthorizeURL($token);
		header('Location: ' . $url);
		break;
	default:
		/* Show notification if something went wrong. */
		echo 'Could not connect to Twitter. Refresh the page or try again later.';
}
5行目では、さっき取得したリクエストトークンの連想配列を使ってTwitterの認証画面URLを取得しています。


③Twitterで認証が完了した後に戻ってくるページは、config.phpで設定したOAUTH_CALLBACKのURLであるcallback.phpになります。このページでは、ユーザーを特定する値であるアクセストークン、アクセスシークレットを取得、セッションへ保存しています。そして、ついにindex.phpへリダイレクトです。

callback.php
/* Create TwitteroAuth object with app key/secret and token key/secret from default phase */
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $_SESSION['oauth_token'], $_SESSION['oauth_token_secret']);

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

/* Save the access tokens. Normally these would be saved in a database for future use. */
$_SESSION['access_token'] = $access_token;
2行目でTwitterOAuthを生成していますが、redirect.phpと違うのはリクエストトークン、リクエストシークレットも使っている事です。このように、TwitterOAuthを生成する方法も変わってくるのが混乱の元のようです。そして5行目にある「oauth_verifier」とは何のことでしょうか。これはTwitter認証画面からcallback.phpに戻ってくるときに、oauth_verifierというGETパラメータが追加されているのです。Twitter的には、「正式に認証したので、このパラメータを使ってアクセストークンを取得してください」という事です。了解しました・・・という事で、5行目でアクセストークンの連想配列を取得しています。連想配列のキーですが、なんとリクエストトークンと同じ「oauth_token」と「oauth_token_secret」なのです・・・。こりゃ混乱するって!!


index.phpでは、取得したアクセストークンを使ってユーザーのTwitter情報を取得しています。リクエストトークンは、認証のたびに変化しますが、このアクセストークンはいつでも同じ文字列になります。
この特徴を利用して、サイトのログインにTwitterの認証機能を使う事ができるのです。ユーザーがサイトで新規登録する時、Twitterの認証を行わせます。そしてサイトに帰ってきたら、アクセストークンをDBなどに登録します。ユーザーが再びサイトにアクセスし、ログインの変わりにTwitter認証させ、取得したアクセストークンをDBで存在チェックします。一致するアクセストークンが存在する場合は既存ユーザー、存在しない場合は新規ユーザーという事です。


index.php
/* Get user access tokens out of the session. */
$access_token = $_SESSION['access_token'];

/* Create a TwitterOauth object with consumer/user tokens. */
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $access_token['oauth_token'], $access_token['oauth_token_secret']);

/* If method is set change API call made. Test is called by default. */
$content = $connection->get('account/verify_credentials');
まずはcallback.phpで取得したアクセストークンの連想配列を変数にセットし、5行目でTwitterOAuthを生成していますが、またまた引数が違います。今度はアクセストークンを使っていますね。生成の方法によって、呼び出せるメソッドを制御しているのでしょう(制御はおおげさかのー)。8行目で、ユーザーのTwitter情報を取得しています。


Twitter情報の取得

さて、Twitter情報の取得ですが、今回の場合はindex.phpで以下のように記述して取得しました。
$content = $connection->get('account/verify_credentials');
「account/verify_credentials」の部分で、取得する情報が決定されます。今回は「自分が有効なユーザかを取得」しました。では、「つぶやき」や「フォロー」はどうやって取得するのでしょうか。まずは、以下のサイトをご覧下さい。

http://dx.24-7.co.jp/twitterapi1-1-rest-api/

こちらで、取得情報の一覧が確認できます。例えば、自分のつぶやきを表示するには、「statuses/user_timeline」、フォローユーザーの取得は「friends/list」といった感じです。

また、このようにすれば取得件数も指定できます。
$content = $connection->get('statuses/user_timeline',array('count'=>'100'));
この例では、最新のつぶやきから100件取得します。ただし、情報取得の乱発は注意が必要です。先ほどの参考サイトにおいて、リミットという項目に気付きましたか?
詳しくは参考サイト上部にも記述がありますが、Twitterのサーバーの負荷を軽減する為に呼び出し回数の制限があります。この制限を越えた場合は、最大で15分間、アクセスできなくなります。なので、アナタのサイトでTwitter情報を取得する場合は、回数の制限をするなり、エラーが帰ってきた場合の処理を追加するなり対処が必要です。


コンシューマキーの取得

最後になりますが、アプリケーション(サイト)に割り振られたキーと鍵である、コンシューマキーの取得についてです(最初に書けよ…)。

TwitterのDevelopersサイトでサイトの登録をして取得します。以下のページへ進んでください。
https://dev.twitter.com/apps

そして、以下の順番に進んでください。
①アナタのTwitterアカウントでログイン
②「Create a new application」をクリック
③「Name」、「Description」、「Website」を入力し、規約に同意して「Create your Twitter application」をクリック。
  • Name…サイトの名称
  • Description…サイトの説明
  • Website…サイトのURL
この項目はTwitterの認証画面で表示される項目です。Twitter的には認証するユーザーに対して、どういったアプリケーション(サイト)と連携するのかを表示したい…という事なのでしょう。

④もし①で使ったTwitterアカウントでつぶやきたい場合(botなど)は、「Setting」タブにあるApplication typeの項目のAccessを「Read and Write」に変更し、一番下にある「Update this Twitter application’s settings」ボタンをクリック。 この項目は、①で使ったアカウントに対しての設定です。ここで「Read only」としても、アプリケーション(サイト)を使うユーザーのTwitterアカウントでWrite(つぶやきなど)ができないわけではありません(①で使ったアカウントはできません)。
⑤「Detail」タブにある「Consumer key」、「Consumer secret」をconfig.phpに設定。 ちなみに「Detail」タブには、下の方に「Access token」、「Access token secret」もあります。これは、①のTwitterアカウントのアクセストークンです。Twitter認証を①のアカウントで行えば、同じ値が取得できます。botを作る場合は認証をしませんので、アクセストークンが取得できません。これを使いましょう。

以上でTwitterOAuthの説明は終了です。いかがでしたでしょうか?
処理の流れと意味がわかっていれば色々と応用できます。botの作成もアクセストークン、アクセスシークレットの使い方と、Twitter情報の取得方法が理解できていれば作業がはかどりますね。
あとはアナタのサイトでやりたいようにカスタマイズしてみてください。


リクエストトークンでユーザーの確認

更なる理解ほ深めたいアナタに、リクエストトークンの使われ方についてもう少し掘り下げてみたいと思います。

具体的な流れの②で、redirect.phpの処理を説明しました。
~再掲~
redirect.phpに飛ぶと、ようやくそれらしい処理が始まります。ここでは、config.phpで設定したコンシューマキー、コンシューマシークレット、callback.phpのパスを使って、リクエストトークン、リクエストシークレットを取得。更にリクエストトークンを使ってTwitterの認証画面URLを生成し、そのままTwitter認証画面へリダイレクトします。

redirect.php以降の流れは・・・
redirect.php

Twitter認証画面

callback.php

となっているのですが、ここでは何が行われているのでしょうか?

①まずredirect.phpでリクエストトークン、リクエストシークレットを取得、セッションに保存、Twitterの認証画面URLに「?oauth_token=リクエストトークン」を追加。

②Twitter認証画面で認証。リダイレクト先であるcallback.phpのURLに、Twitterの認証画面URLにくっついてる「?oauth_token=リクエストトークン」を追加。
※「oauth_verifier」も追加される。

③callback.phpで、URLにくっついてる「oauth_token」の値と、セッションの「リクエストトークン」を照合。
リクエストトークンは、Twitter認証画面URLを生成するたびに作られ、毎回違う文字列でした。なので、この照合が一致する場合は、まさにさっきTwitter認証したユーザーと一致したという事になります。「今回のTwitter認証リクエストを要請し、認証が成功し、戻ってきたユーザーである」といったところでしょうか。

この照合を実行しているのがcallback.phpの以下の部分です。
/* If the oauth_token is old redirect to the connect page. */
if (isset($_REQUEST['oauth_token']) && $_SESSION['oauth_token'] !== $_REQUEST['oauth_token']) {
  $_SESSION['oauth_status'] = 'oldtoken';
  header('Location: /info/twitteroauth/clearsessions.php');
}

もし一致しなければ、セッションを全て消去し、connect.phpからやり直しになります。
つまり、リクエストトークンの意味とは、Twitter認証画面の前後のユーザーが一致するかどうかの確認の為にあるのだと思います。


少々長くなりましたが、TwitterOAuthについて説明してきました。
もしアナタの何かの手助けになれたなら幸いです。ぜひSNSでの拡散お願いします☆

コメントを書く

80 名無しさん
2017-01-20 00:39:14
Many thanks very handy. Will share site with my good friends.
79 cialispriceNM
2017-01-20 00:35:02
Thanks with regard to delivering these very good subject matter.
78 cialis_pillsNM
2017-01-19 20:30:25
Appreciate it for sharing your excellent website.



※必須です
※必須です