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

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

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

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

コメントを書く

113 rclz87
2017-02-24 09:01:10
The Resolved Sponsorship and Affordable Protect Act was signed into law Walk 23rd, 2010 and upheld past a paramount court ruling on June 28, 2012. During the ruling, the law was changed to let someone have states to http://canadianpharmacyscript.com/ online pharmacy opt-out of expanding access to Medicaid. Learn more about Medicaid Distention and how this bromide crumb interchange has left millions without http://canadianpharmacies.space/ pharmacy online robustness insurance. The law requires all Americans entertain well-being warranty next to 2014 (or pay a per month fee in favour of each month without lowest quintessential coverage). Although this shared responsibility stockpile http://onlinepharmacy.cloud/ canada drug pharmacy is unofficially called an peculiar mandate, it was ruled to be in happening a tithe and not a mandate on the June 28, 2012, Supreme Court ruling.
112 Williamdop
2017-02-24 05:03:07
Hello! <a href=http://propecia1mg.cricket/#7>order propecia bosley</a> great site.
111 Williamdop
2017-02-23 11:08:38
Hi there! <a href=http://propecia1mg.cricket/#7>how can i buy propecia online</a> good web site.
110 Williamdop
2017-02-23 06:51:11
Hi! <a href=http://propecia1mg.cricket/#2>where to purchase propecia</a> good site.
109 Leonardrek
2017-02-22 04:52:17
Hi there! <a href=http://lasix365.accountant/#buy-lasix-no-prescription>buy lasix online</a> good internet site.
108 Leonardrek
2017-02-21 22:06:01
Hi! <a href=http://lasix365.accountant/#lasix>lasix generic</a> beneficial internet site.
107 Leonardrek
2017-02-21 15:34:31
Hello! <a href=http://lasix365.accountant/#lasix-online>purchase lasix</a> great internet site.
106 Leonardrek
2017-02-21 08:27:13
Hi there! <a href=http://lasix365.accountant/#buy-lasix-online>buy furosemide</a> beneficial site.
105 Leroyphync
2017-02-20 15:30:48
Hello there! <a href=http://lasix365.accountant/>buy furosemide pills</a> good website.
104 Leroyphync
2017-02-20 07:58:06
Howdy! <a href=http://lasix365.accountant/>purchase lasix online no prescription</a> excellent web site.
103 hwuqndx
2017-02-20 07:39:41
The Patient Protection and Affordable Take responsibility for Mandate was signed into law Parade 23rd, 2010 and upheld alongside a unsurpassed court ruling on June 28, 2012. During the ruling, the law was changed to approve states to http://tadalafilcoupon.top/#58502 cialis free trial opt-out of expanding access to Medicaid. Learn more about Medicaid Expansion and how this one teeny-weeny interchange has communistic millions without http://tadalafilforsale.top/#nwuer.html cialis for sale health insurance. The law requires all Americans have well-being guaranty nigh 2014 (or recompense a per month fee for each month without nadir fundamental coverage). Although this shared reliability proviso http://tadalafildaily.top/ cialis daily use is unofficially called an own mandate, it was ruled to be in the poop indeed a tax and not a mandate by the June 28, 2012, Foremost Court ruling.
102 Joshuaepipt
2017-02-20 02:48:42
Hello there! <a href=http://clomid365.accountant/>purchase clomiphene pills</a> good web site.
101 Leroyphync
2017-02-20 00:29:14
Howdy! <a href=http://lasix365.accountant/>generic lasix</a> very good internet site.
100 Joshuaepipt
2017-02-19 20:29:10
Hi! <a href=http://clomid365.accountant/>order clomiphene no prescription</a> very good internet site.
99 Joshuaepipt
2017-02-19 09:11:59
Hello there! <a href=http://clomid365.accountant/>purchase clomid</a> very good web page.
98 Georgeacigo
2017-02-18 23:35:50
Hello there! <a href=http://prozac365.accountant/#purchase-prozac-pills-online>purchase prozac cheap</a> beneficial website.
97 Georgeacigo
2017-02-18 10:21:05
Hi there! <a href=http://prozac365.accountant/#buy-prozac-uk>order fluoxetine no prescription</a> great website.
96 Georgeacigo
2017-02-18 02:09:19
Hello there! <a href=http://prozac365.accountant/#purchase-prozac-usa>purchase fluoxetine no prescription</a> very good website.
95 jhqo98
2017-02-18 00:07:01
Importance The Affordable Sadness Portray is the most important healthfulness disquiet legislation enacted in the In harmony States since the start of Medicare and Medicaid in 1965. The law implemented extensive reforms http://viagra-withoutadoctorsprescription.org/#71453ki generic Viagra Without a doctor prescription designed to repair the accessibility, affordability, and trait of haleness care.
94 Georgeacigo
2017-02-17 17:46:07
Howdy! <a href=http://prozac365.accountant/#buy-prozac-cheap>order prozac medication</a> great website.
93 RichardKnive
2017-02-17 07:23:34
Hello there! <a href=http://prozac365.accountant/>buy prozac online without prescription</a> beneficial web site.
92 Jamesinick
2017-02-17 05:24:03
Howdy! <a href=http://prednisone365.accountant/>prednisone online</a> beneficial web site.
91 Jameswal
2017-02-16 21:18:58
Hi there! <a href=http://prednisone365.accountant/>buy prednisone pills online</a> beneficial website.
90 Charleswheek
2017-02-16 16:06:45
Hello there! <a href=http://prozac365.accountant/>purchase generic prozac</a> great internet site.
89 Snkhmgc
2017-02-16 11:50:22
WASHINGTON — On the fight of healthiness care, Sens. Bernie Sanders (I-Vt.) and Ted Cruz (R-Texas) approve on damned little. Identical of the more spirited exchanges came after Sanders asked Cruz if he believes, http://www.viagrawithoutdoctorprescription.accountant/ viagra without subscription as Sanders does, that every American is entitled to health carefulness as a right.
88 Charleswheek
2017-02-16 08:29:58
Hello there! <a href=http://prozac365.accountant/>buy prozac</a> great web page.
87 Zrwevcm
2017-02-16 04:43:36
Receive low prices when you ’ http://canadianpharmacyv.com/ canadian pharmacy king dosage isn't working, should I quit taking the drug?, If you need to economize, order your best canadian pharmacy http://canadapharmacyonlinev.com/ are so much better online. Check this out, first-rate online pharmacies the moment you decide to canadian pharmacy online http://bestcanadianpharmacyv.com/ now., It is now easy to get a canadian pharmacy review http://canadaonlinepharmacyv.com/ to control symptoms, Buy a online canadian pharmacy http://canadianpharmacyonlinev.com/ without a prescription? !
86 Jameswal
2017-02-16 01:41:18
Hello! <a href=http://prednisone365.accountant/>purchase prednisone online no prescription</a> good web site.
85 igbzre
2017-02-14 07:11:43
Concern The Affordable Anguish Step is the most weighty form love legislation enacted in the Shared States since the start of Medicare and Medicaid in 1965. The law implemented complete reforms http://viagrawithoutadoctorsprescription.org/ viagra without a doctor prescription designed to improve the accessibility, affordability, and quality of salubrity care.
84 vng43j
2017-02-14 01:31:19
You take one's leave of be without hinder notified if we press respecting anything more than your prescription. Without the documents mentioned more than, http://viagrawithoutadoctorprescriptions.org/ viagra online without prescription guts not be ace to forge and set sail your order.
83 paydayS
2017-02-13 05:32:39
Great internet site! It looks extremely professional! Sustain the helpful work!
82 advanceA
2017-02-13 01:27:35
Particularly instructive look onward to coming back again.
81 loanS
2017-02-13 01:27:33
Whoa, this is a important web site.
80 loansA
2017-02-12 21:07:27
Thank you! It is definitely an superb site.
79 installmentS
2017-02-12 21:07:23
What's happening, well put together website you have got going here.
Over 20 million on be exempt from the fee alongside 2016. Those with exemptions can in many cases soundless deplane http://viagrawithoutdoctorsprescription.org/#17190 viagra without a doctor prescription charge assistance. Exemptions also make the grade you to exclusive enrollment. There are once in a while more restrictive coverage options, and all major medical coverage options be required to accommodate nominal essential coverage code-copilot.sacred-field.com.
77 loansS
2017-02-12 18:45:24
Fantastic website you've going here.
76 loanA
2017-02-12 18:45:23
Fantastic internet site you've got right here.
75 creditS
2017-02-12 15:56:38
Thanks a bunch! This is definitely an good web page.



※必須です
※必須です