TwitterでOAuth接続

2010/08/12
久々にPHPネタ。 と言うか、今更ながらOAuth接続を試してみる。

ライブラリダウンロード

ライブラリ、サンプルはここから http://apiwiki.twitter.com/OAuth-Examples ※PHPライブラリ:http://github.com/abraham/twitteroauth ちなみにGoogle-codeにもライブラリがあるが、コアのライブラリOAuth.phpは全く同じものだ。 Google-code oauth これが多分、デファクトスタンダードでしょう。 さて、実際にabraham-twitterのサンプルプログラムをちょちょっと改修してテストしてみました。 (リファクタリングしてないので見にくいですが・・・)

インストール

ダウンロードしたabraham-twitteroauthの中身 OAuth twitteroauthディレクトリがライブラリなので、プログラムで利用するパスに配置します。 ※その他のコンテンツはサンプルプログラムなので不要

連携アプリの設定

まず、Twitterアプリを利用できるように認証の設定が必要です。 (1) Twitterにログインし連携アプリを開く。 OAuth (2) 開発者への欄のリンクを開く。 実際のURLは、http://twitter.com/apps (3) 新しいアプリケーションを追加を開く。 OAuth 実際のURLは、http://twitter.com/new (4) 必要項目を入力する。 OAuth

・アプリケーションのアイコン: 連携アプリに出てくるアイコンです ・アプリケーション名: 何でもよいですが、わかりやすくシンプルな方がいいでしょう ・アプリケーションの説明: ユーザに何をするのかを説明します ・アプリケーションのウェブサイトURL、所属会社/団体、サイト: ここら辺は任意で入力 ・アプリケーションの種類:  クライアントアプリケーション = モバイルやデスクトップアプリならこれを選択  ブラウザアプリケーション = ブラウザアプリならこれを選択 要はリダイレクトをTwitter連携アプリでするか、自分のプログラムでするかの違いです。 ・コールバックURL: ブラウザアプリケーションを選択すると入力できます。 ・Default Access type: ユーザの書き込み権限を許可するかどうか? ・Twitterでログインする: Twitterでログインするかどうか? 通常はオンにしておくと楽でしょう。

(5) 設定が完了すると、Consumer keyとConsumer secretが発行されます。 OAuth

PHPでのプログラム

※表示するhtmlソースは記載してません (1) twitteroauth/twitteroauth.phpのパスを通す。
require_once 'twitteroauth/twitteroauth.php';
(2) Twitterアプリの発行したConsumer keyとConsumer secretおよび、手動でコールバックするのであれば、認証後のURLを設定する。
define('CONSUMER_KEY', 'Consumer key');
define('CONSUMER_SECRET', 'Consumer secret');
define('OAUTH_CALLBACK', 'コールバックするURL');
(3) 現在のセッションから認証状況チェック まずPHPセッションを利用してトークンの状況を判断し、処理を振り分けます。
    function oauth() {
        if (empty($this->session['access_token']) || empty($this->session['access_token']['oauth_token']) || empty($this->session['access_token']['oauth_token_secret'])) {
            $this->redirect_to('connect');
        }
        $access_token = $this->session['access_token'];
        $connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $access_token['oauth_token'], $access_token['oauth_token_secret']);
        $this->content = $connection->get('account/verify_credentials');
    }
※$this->redirect_to()は、リダイレクトする独自関数 セッションにトークンがなければ認証画面(./connect)にリダイレクトします。 トークンがあれば、TwitterOAuthのget('account/verify_credentials')でTwitter情報を取得し、$this->contentに割り当てます。 (4) セッションクリア処理で、access_token、status破棄し認証画面にリダイレクト
    function clear() {
        unset($this->session['access_token']);
        unset($this->session['status']);
        $this->redirect_to('connect');
    }
(5) 認証画面
    function connect() {
        if (!defined('CONSUMER_KEY') || !defined('CONSUMER_SECRET')) {
            echo('consumer_key、consumer_secretが設定されていません');
            exit;
        }
    }
念のためCONSUMER_KEY、CONSUMER_SECRETをチェックしてから認証画面を表示します。 ※表示するhtmlソースは記載してません OAuth 「Twitterに接続する」をクリックすると./redirectへリンクします。 ※$this->sessionは、セッション管理の独自プロパティで、$_SESSIONみたいなものです (6) Twitter連携アプリへの認証処理 認証画面からアクセスされる処理です。
    function redirect() {
        $connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET);
        $request_token = $connection->getRequestToken(OAUTH_CALLBACK);

        $this->session['oauth_token'] = $token = $request_token['oauth_token'];
        $this->session['oauth_token_secret'] = $request_token['oauth_token_secret'];
         
        switch ($connection->http_code) {
          case 200:
            $url = $connection->getAuthorizeURL($token);
            header("Location: {$url}"); 
            break;
          default:
            echo 'Twitterに接続できません';
        }
    }
TwitterOAuthのgetRequestToken()でコールバックURLを設定しTwitter連携アプリへ認証処理をします。 認証が成功すると「oauth_token」「oauth_token_secret」が返されるのでセッションに保存します。 またgetAuthorizeURL()でトークンからコールバックURLを取得&リダイレクトします。 OAuth (7) コールバック処理
    function callback() {
        if (isset($_REQUEST['oauth_token']) && $this->session['oauth_token'] !== $_REQUEST['oauth_token']) {
            $this->session['oauth_status'] = 'oldtoken';
            $this->redirect_to('connect');
        }

        $connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $this->session['oauth_token'], $this->session['oauth_token_secret']);
        $this->session['access_token'] = $connection->getAccessToken($_REQUEST['oauth_verifier']);
        unset($this->session['oauth_token']);
        unset($this->session['oauth_token_secret']);

        if (200 == $connection->http_code) {
            $this->session['status'] = 'verified';
            $this->redirect_to('index');
        } else {
            $this->redirect_to('connect');
        }
    }
まず、不正なoauth_tokenでないか判別します。 TwitterOAuthのgetAccessToken($_REQUEST['oauth_verifier'])でaccess_tokenを取得し、oauth_tokenを破棄します。 接続がOK(HTTP 200)なら認証後の画面に、失敗した場合は認証画面にリダイレクトします。 (8) 認証後の画面の表示
    function index() {
        $this->oauth();
    }
認証が通ればTwitter情報を表示します。 ※oauth()で$this->contentにTwitter情報が割り当てられているはず OAuth
フォーム有効期限切れで Page Expired をリダイレクト
ログを日付でローテーションやクリアや削除
Homebrew で PHP8.0 から PHP7.4 にダウングレード
Big sur で zsh 移行と Homebrew アップグレード
Mac に minikube をインストール
途中から .gitignore に追加する
Larevel 6.x から Laravel 8.x にバージョンアップ
Composer で Allowed memory size (メモリ不足)エラー
Blade でカスタムクラスを利用する
git push git pull にブランチ指定せずに実行する
git pull や git push できなくなったとき
Docker のコンテナからホストOS に接続
Mac で ローカル IP アドレス(ipv4)のみを表示する
ホストOS から Docker の MySQLコンテナに接続
caching_sha2_password のエラー
node-config で環境設定ファイルを利用する
rootパスワードを初期化(再設定)する
Git から clone したときのエラー対処
Mac に MySQL をインストール
Mac に PostgreSQL をインストール
Laravel 環境構築 - Mac ネイティブ編
Firebase 入門 - Firebase とは
Firebase 入門 - CLI インストールとデータベースの設定
AWS 無料枠(t2.micro)で容量とメモリエラー
Cloud9 を起動する -初心者編-
gcloud で GCEインスタンスを起動してみる
AWS CLI と jq でインスタンス一覧を整形して表示
React と Laravel7 のプロジェクトを作成する
Homebrewインストール-2020年版
3直線で囲まれた範囲塗りつぶし
PuLP で線形最適化問題を解く
カスタムのペジネーションを作る
node-sass を使って sass をコンパイルする
Log ファサードでSQLログを分離して書き出す
いちから始める Docker - 複数のコンテナを使う - (2020年)
いちから始める Docker - docker-compose を使う - (2020年)
AWS ECR を使ってみる
Laravel7 でマルチ認証
Mac に AWS Client を設定する
Laravel7 リリース
v-html でHTML表示する
Laravel で Nuxt.js を使ってみる(Docker環境)
Laravel で Vue コンポーネントを使う
いちから始める Docker -コンテナをビルド- (2020年)
いちから始める Docker -起動してみる- (2020年)
Mac で MySQL(8系)
composer で vendor がインストールできない
Eloquent の日付を Carbon で扱う
webpack 4 入門(npm編)
[Mac]容量を減らす