PHP で OAuth ログインを実装するなら「Opauth」が簡単で便利

以前こんな記事を書いたことがあるんだけど

そのときから Twitter API の仕様も変わってて
この記事をそのまんまなぞったらうまくいかない部分があると思います。

更新しないとなーと思いつつなかなか対応できてないんだけど、
Opauth を使えばここに書いた処理のほとんどを勝手にやってくれるから
もうこれでいいんじゃないかという気がしてます。

Opauth とは

サイトのタイトルにも書かれてるけど、
複数プロバイダに対応した PHP の認証フレームワークです。

Opauth のいいところ

対応ログインプロバイダが豊富

使ったことがあるサービスだけを挙げても
すでにこのへんのログインに対応してる。

  • Bitbucket
  • Evernote
  • Facebook
  • Flickr
  • Foursquare
  • GitHub
  • Google
  • Instagram
  • LinkedIn
  • Windows Live
  • mixi
  • OpenID
  • PayPal
  • Tumblr
  • Twitter
  • Vimeo
  • Yahoo! Japan

他多数。
mixi や Yahoo! Japan もありますね。

主要なフレームワークに対応

これを書いている時点で、
公式ドキュメントに載っているだけでも
次の PHP フレームワークに対応してます。
対応してるっていうのは、Opauth プラグインがあるという意味ね。

  • CakePHP
  • CodeIgniter
  • FuelPHP
  • Laravel
  • PrestaShop
  • Silex
  • Yii Framework
  • Zend Framework 2
  • Nette

ユーザー情報の書式を勝手に統一してくれる

後述します。

Composer 標準対応

後述します。

Opauth の使い方

インストール

まずは Opauth を取ってきます。

Composer を使う場合

Composer が使える環境ならこれでやるのが一番簡単ですね。
composer.json ファイルをこんなふうに書いて

{
    "require":{
        "opauth/opauth": "*"
    }
}

composer install するだけ。

実際には利用するログインプロバイダ向けの Strategy も必要なので
例えば Facebook と Twitter を使う場合はこんなふうになると思います。

{
    "require":{
        "opauth/opauth": "<em>",
        "opauth/facebook": "</em>",
        "opauth/twitter": "*"
    }
}

インストールしたら vendor/autoload.phprequire するだけで
必要なクラスがオートロードされますね。Composer べんり。

[PR] Composer の使い方については、こちらの書籍をご覧ください。

直接ダウンロードする場合

Opauth 本体はこちらから

利用する Strategy はこちらの一覧から選んでダウンロードします。

Opauth 本体を解凍すると lib/ の下に
Opauth/Strategy/ というディレクトリがあるので
その下に使いたい Stragety と同じ名前のディレクトリを作って
Strategy ファイルはその下に置きます。

例えば Facebook 用ならここ。
Opauth/Strategy/Facebook/FacebookStrategy.php

あとは

require '{Opauth までのパス}/Opauth.php';

するだけ。

Strategy のファイルは
上記のルールに沿って設置してあれば自動で読まれるはずです。

設定値を用意する

Opauth を呼び出すとき、設定値を配列に入れて渡すので
それを用意します。

以下は

  • Twitter と Facebook を使う
  • 認証は URL の /auth/ 以下で行う
  • 認証から帰ってきたユーザーは callback.php にリダイレクトされる

場合の例です。

$config = [
    'security_salt' => 'ランダムな文字列', //レスポンスのシグネチャ生成に使うソルト値。デフォルトのままだと Notice が出ておこられる
    'path' => '/auth/', // Opauth を動かす URL のパス
    'callback_url' => '{path}callback.php',

    'Strategy' => [
        'Twitter' => [
            'key' => '{Twitter の Consumer Key}',
            'secret' => '{Twitter の Consumer Secret}'
        ],
        'Facebook' => [
            'app_id' => '{Facebook の App ID}',
            'app_secret' => '{Facebook の App Secret}',
        ]
    ]
];

これを config.php か何か適当な場所に書いておいて
あとで実行ファイルから呼び出します。

Twitter の Consumer や Facebook の App 情報の取り方は
これらの記事にざっと書いてあるので

必要に応じて参照してください。

その他、詳しい書き方はこちら。

.htaccess を置く

上記の例では、最終的に

  • /auth/twitter にアクセスすると Twitter の認証
  • /auth/facebook にアクセスすると Facebook の認証

という動作にしようとしています。

実際には /twitter や /facebook というディレクトリやファイルがあるんじゃなくて
のため、/auth/ 以下に来たら index.php (index じゃなくてもいいけど) が呼ばれるという動作なので
それを行うために .htaccess (など) で設定を行います。

これを .htaccess という名前のファイルに書いて /auth/ の下に設置。

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

Apache 以外のウェブサーバーの場合や
Apache だけど mod_rewrite が有効になってない場合は
それにあわせてうまいこと対応してください。

これで、/auth/twitter/auth/facebook にアクセスがあると
/auth/index.php が呼び出されます。

実行部分のコード

上の例で呼ばれる index.php をこんなふうにします。
これは Composer を使う場合の例。

<?php
$root = dirname(dirname(__DIR__));
require $root . '/vendor/autoload.php';
require $root . '/config/config.php';

new Opauth($config);

これだけです。

これだけで、/auth/twitter なら Twitter の認証画面に
/auth/facebook なら Facebook の認証画面に
ユーザーが転送されます。

コールバック

認証画面から帰ってきたユーザーは
前述の設定ファイルで 'callback_url' に指定したところに帰ってきます
今回の例なら /auth/callback.php ですね。

こんなことを書いてみます。

<?php
session_start();
var_dump($_SESSION);

もうこれだけで、ユーザーの認証情報が確認できます。

ユーザーは認証プロバイダから直接 callback.php へ来るんじゃなくて
いったん index.php に戻ってきてから callback に飛ばされる格好。
index の時点で認証情報が自動的にセッションに入るので
コールバック側ではもう Opauth はつつかなくていい。
$_SESSION を見ればぜんぶ入ってます。

要するに実行コードの index.php で設定情報を Opauth クラスに渡しているだけで
あとは全部 Opauth がやってくれる。これは楽ちんだ。

得られるユーザー情報

認証先によって、渡してくれるユーザー情報は異なります。
Twitter API と Facebook API では返してくれるパラメータが違うから当然。

ところが Opauth はそこの違いもうまいこと吸収してくれます。
これがまた便利なところ。

もちろん Twitter にしかない、あるいは Facebook にしかない値はあるけど
だいたいの認証プロバイダは持っているであろう値を決まった書式に整えてくれる。
「どうせこれは使うんでしょ」というのは面倒を見てくれるということです。

認証後に Session に入れてくれるのはこんな配列。

Array(
    [opauth] => Array(
        [auth] => Array(
            [provider] => 'Twitter''Facebook' など、利用した認証プロバイダの名前
            [uid] => ユーザーの ID
            [info] => Array(
                [name] => ユーザーの名前
                [email] => ユーザーのメールアドレス
                [nickname] => Facebook なら ID、Twitter なら screen name
                [urls] => Array(ユーザーが登録している各種 URL)
                [location] => ユーザーの所在地
                [description] => ユーザーの自己紹介文
                [image] => プロフィール画像の URL
            )
            [credentials] => Array(認証情報)
            [raw] => Array(認証プロバイダから返された生の認証データ)
        )
        [timestamp] => タイムスタンプ
        [signature] => シグネチャ
    )
)

この [info] のところが便利で、
確認証プロバイダごとにばらばらなユーザー情報のフォーマットを
だいたい同じ名前に整えて入れといてくれます。

返ってきた認証情報を見て、名前ひとつ取得するにも
Twitter ならここ、Facebook ならここ、といちいち分ける必要なし。

なお、認証後に得られる値はクエリパラメータで渡されることもあり
正当なものかどうかのバリデーションが必要ですが、
この処理も Opauth が自動でやってくれてます。

楽ちんなのはいいことだ

もちろん Opauth はたまたま使ってみて「これいい」と思っただけで
他にも便利なツールはあると思います。
「これもいいよ」というのがあったら教えてください。

ともかく、自分で書かなくてもいい処理をこういうありがたい仕組みに任せると
自分が作るべきものを作るのに集中できますね。

楽ちんなのはいいことだ。

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