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

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

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

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での拡散お願いします☆

コメントを書く

101 EK Rof
2017-03-25 11:49:38
viagra and cialis
http://buyviagrawvrx.com - viagra vs staxyn
cost of viagra per pill
<a href="http://buyviagrawvrx.com">viagra que es</a>
100 Bobbiedow
2017-03-25 03:02:44
Hi! <a href=http://viagrafreetrial.us/>viagra 30 day free trial</a> good internet site.
99 Mariobup
2017-03-25 01:19:19
Hello there! <a href=http://online-pharmacies.accountant/#6>live pharmacy ce online</a> very good site.
98 DavidDug
2017-03-24 14:26:23
Hello! <a href=http://onlinepharmacyrx.ru/#reputable-online-pharmacy>online pharmacies</a> great internet site.
97 Eb Rof
2017-03-24 09:04:02
which viagra is right for me
http://buyviagrawvrx.com - generic viagra
viagra law
<a href="http://buyviagrawvrx.com">viagra online</a>
96 canadian pharmacies
2017-03-24 06:35:22
http://canadianpharmacy24.us.com/ canada pharmacy
95 Nsgoih
2017-03-24 02:16:12
<a href="http://generic5menviav.com/">tadalafil tablets</a>

Hi there this is kind of of off topic but I was wanting to know if blogs use WYSIWYG editors or if you have to manually code with HTML. I'm starting a blog soon but have no coding experience so I wanted to get advice from someone with experience. Any help would be enormously appreciated! ’ http://generic5menviav.com/
94 Zeljwp
2017-03-23 21:03:07
<a href="http://via5menonlinev.com/">viagra cheap</a>

Hi, tidy site you've in here. ’ http://via5menonlinev.com/
93 DavidDug
2017-03-23 21:00:57
Hi there! <a href=http://online-pharmacies.accountant/#pharmacy-school-online>online pharmacies</a> very good web page.
92 albuterol
2017-03-23 19:03:34
Albuterol HFA is the prescription of inhaled drug that is used to treat or prevent the age of four or more human bronchial reversible obstructive pulmonary disease. <a href=" http://ventolininhaler.us.com/ ">ventolin</a>, bronchospasm (EIB) for up to 4 years of age or older. administration to a patient. Ventolin HFA is not known whether it is safe and effective in less than 4 years of age.
91 DavidDug
2017-03-23 13:33:36
Howdy! <a href=http://online-pharmacies.accountant/#canadian-pharmacy-online>online pharmacy</a> excellent site.
90 Ws rox
2017-03-23 10:55:55
lasix and viagra cialis generic pronounce
http://buycialisvvvrx.com - cialis cost

cialis sales online
<a href="http://buycialisvvvrx.com">cialis</a>
89 Hixseshy
2017-03-23 06:24:34
edrugstore cialis pills
http://buycialishrx.com - generic cialis
buy cialis soft
<a href="http://buycialishrx.com">cialis cost</a>
88 Nuzeau
2017-03-23 05:39:21
<a href="http://canadadrugsonline7.com/">cheap viagra</a>

Wow that was strange. I just wrote an really long comment but after I clicked submit my comment didn't show up. Grrrr... well I'm not writing all that over again. Anyway, just wanted to say great blog! ’ http://canadadrugsonline7.com/
87 YsdAlbug
2017-03-22 21:08:24
cialis generic cheap viagra
<a href=http://buycialiswvrx.com>cheap cialis from canada</a>
generic cialis 20mg
<a href="http://buycialiswvrx.com">genuine cialis online pharmacy</a>
86 vqv54x
2017-03-22 08:07:46
medical equipment trade shows
http://viagra-withoutadoctorsprescription.com/ viagra without a doctor prescription
medical equipment of florida
<a href="http://viagra-withoutadoctorsprescription.com/">viagra without a doctor prescription</a>
85 NeoBAZY
2017-03-22 06:21:24
is viagra really needed cialis pills
http://cialisnrx.com - cialis
vicodin and cialis generic buy
<a href="http://cialisnrx.com">buy cialis online cheap</a>
84 Skjbng
2017-03-22 03:11:20
cialis pill http://js-renovation.fr/?option=com_k2&view=itemlist&task=user&id=1226542 buy cialis without prescription http://serralheriataboaodaserra.com.br/?option=com_k2&view=itemlist&task=user&id=340474 tadalafil online http://ragstyle.com.co/index.php?option=com_k2&view=itemlist&task=user&id=124186 no prescription cialis http://ealink.gotoip3.com/index.php?option=com_k2&view=itemlist&task=user&id=36370 cialis pill http://www.forum.dobre-okna.com/index.php?option=com_k2&view=itemlist&task=user&id=12424 tadalafil 20 mg http://alpegrandbrianconnais.com/index.php?option=com_k2&view=itemlist&task=user&id=1035 cialis tadalafil http://kabylievoyages.com/?option=com_k2&view=itemlist&task=user&id=3992 generic tadalafil http://canchasfutbolmedellin.com/index.php/component/users/?option=com_k2&view=itemlist&task=user&id=110540 cialis without a prescription http://copei.edu.ec/index.php?option=com_k2&view=itemlist&task=user&id=5889 cheap cialis http://mosquee-ennasr-heninbeaumont.com/index.php?option=com_k2&view=itemlist&task=user&id=1 cialis 10mg http://oaksoktoberfest.com/index.php?option=com_k2&view=itemlist&task=user&id=15456 order cialis online http://sadvodnikrochino.ru/index.php?option=com_k2&view=itemlist&task=user&id=1345 tadalafil cialis http://smartcityajmer.com/index.php?option=com_k2&view=itemlist&task=user&id=1000 tadalafil best price http://servicioopticosocial.com/index.php/component/users/?option=com_k2&view=itemlist&task=user&id=1310 cialis no prescription http://ensayofinal.com/?option=com_k2&view=itemlist&task=user&id=5313 cialis pills http://park96.ru/index.php?option=com_k2&view=itemlist&task=user&id=1091 order cialis http://repoman210.com/index.php/component/users/?option=com_k2&view=itemlist&task=user&id=215088 cialis online http://vaconmigo.com/index.php/component/users/?option=com_k2&view=itemlist&task=user&id=1253 cialis tadalafil http://medis46.ru/index.php?option=com_k2&view=itemlist&task=user&id=315 tadalafil cialis http://ta-ng.com/component/k2/itemlist/user/230788 cheapest cialis http://handynick.com.au/index.php/component/users/?option=com_k2&view=itemlist&task=user&id=14662 tadalafil best price http://skplove.org/index.php?option=com_k2&view=itemlist&task=user&id=47893 ’
83 NeoBAZY
2017-03-22 01:16:48
cialis non generic
<a href=http://cialisnrx.com>generic cialis</a>
buy generic cialis in canada
<a href="http://cialisnrx.com">generic cialis canada</a>
82 YidAlbug
2017-03-22 00:38:00
brand cialis online
<a href=http://buycialiswvrx.com>cialis online</a>
where to buy cialis
<a href="http://buycialiswvrx.com">buy generic cialis online</a>
Excipients:
http://viagrawithoutprescriptionadoctor.com/ viagra without a doctor prescription
Composition of the film shell:
<a href="http://viagrawithoutprescriptionadoctor.com/">viagra without a doctor prescription</a>
Patient use:
http://viagrawithoutprescriptionadoctor.com/ viagra without a doctor prescription
80 NeoBAZY
2017-03-22 00:25:12
buy cialis line
<a href=http://cialisnrx.com>purchase cialis generic viagra</a>
order cialis online 37.5
<a href="http://cialisnrx.com">cialis generic vs brand</a>
79 Sjjgxn
2017-03-21 23:11:57
<a href="http://men4onlineagc.com/">cialis no prescription</a>

Heya excellent blog! Does running a blog such as this require a large amount of work? I've no expertise in computer programming however I was hoping to start my own blog in the near future. Anyway, should you have any ideas or techniques for new blog owners please share. I understand this is off subject but I simply wanted to ask. Thanks! ’ http://men4onlineagc.com/
78 Sjujws
2017-03-21 06:03:46
<a href="http://buygenericviagraonlinedefv.com/">buy sildenafil</a>

Hey I know this is off topic but I was wondering if you knew of any widgets I could add to my blog that automatically tweet my newest twitter updates. I've been looking for a plug-in like this for quite some time and was hoping maybe you would have some experience with something like this. Please let me know if you run into anything. I truly enjoy reading your blog and I look forward to your new updates. ’ http://buygenericviagraonlinedefv.com/
77 xomcrq
2017-03-21 04:38:49
How does Cialis work? Cialis works by enhancing the effects of bromide of the chemicals the essentials normally releases into the pen during http://ed-genericviagra.com/ generic viagra for sale arousal. This allows an prolong of blood pour into the pen. An erection is the effect of an increase in blood whirl into certain internal areas of the <a href="http://ed-genericviagra.com/">generic viagra 100mg</a>.
76 Sqozie
2017-03-21 04:06:49
<a href="http://genericviagraonlinederg.com/">free viagra</a>

This is very interesting, You are a very skilled blogger. I've joined your rss feed and look forward to seeking more of your wonderful post. Also, I've shared your web site in my social networks! ’ http://genericviagraonlinederg.com/
Excipients:
http://viagrawithoutprescriptionadoctor.com/ viagra without a doctor prescription
Composition of the film shell:
<a href="http://viagrawithoutprescriptionadoctor.com/">viagra without a doctor prescription</a>
Patient use:
http://viagrawithoutprescriptionadoctor.com/ viagra without a doctor's prescription



※必須です
※必須です