search
LoginSignup
25

More than 5 years have passed since last update.

posted at

updated at

oriceon/oauth-5-laravelを使ったLaravel 5のOAuth認証

はじめに

Laravel5はLaravel4に比べて互換性がないと言ってもいいほど大部変わっています。

今回は試しに今まで使っていたartdarek/oauth-4-laravelのOAuthライブラリを使ってLaravel5にインストールしてみました。

と!その前に、先ほど話したようにLaravel5とLaravel4の互換性はないと言ってもいいほど大部違うので、そんな簡単にインストールできるはずはありません。まず、artdarek/oauth-4-laravelのissueをLaravel 5というキーワードで検索してどんな問題があったかを探ってみました。

スクリーンショット 2015-02-16 午後0.55.01.png

きたああ!!!やっぱりそういうissueがあります。海外ではL5のことをLaravel 5と指しています。

では、さっそく一番目のissueの読んでみます。どうやら、oriceonさんがすでにoauth-5-laravel用のラリブラリーを作ったらしいので、さっそくそれを試してみます。(いまのところはこのレポはpull-request待ちですが、これをmergeしてしまうとおそらくLaravel 4の対応は消えてしまうのではないか)

Composer update

oriceonさんが作ったLaravel 5に対応したOAuthのレポジトリですが、2015年2月11日に作ったものらしくて、出来立てのレポジトリです。

まず、このレポジトリはpackagistに登録されていないものなので、githubから取得するしかないんです。この際にcomposer.jsonはrequire以外にrepositoryを追加する必要があります。そして、masterブランチをcloneするので、バージョンはdev-masterになります。

    "require": {
        "laravel/framework": "5.0.*",
        "oriceon/oauth-5-laravel":"dev-master"
    },
    "repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/oriceon/oauth-5-laravel"
        }
    ],

次に、composerをアップデートします。

composer update

app.phpにpackage登録

アップデートが完了したらartdarek/oauth-4-laravelと同じようにconfig/app.phpファイルを編集してpackageを登録します。

'providers' => array(
    // ...

    'Artdarek\OAuth\OAuthServiceProvider'
)
// ....

'aliases' => array(
    // ...

    'OAuth' => 'Artdarek\OAuth\Facade\OAuth',
)

client_idとclient_secretの設定

Laravel 5では別のvendorコマンドを用意しました。まず、初期ファイルを生成してもらうので次のvendorコマンドを実行。

php artisan vendor:publish

そして、config/oauth-5-laravel.phpに次のような初期設定ファイルが生成されます。

<?php
return [ 

    /*
    |--------------------------------------------------------------------------
    | oAuth Config
    |--------------------------------------------------------------------------
    */

    /**
     * Storage
     */
    'storage' => 'Session', 

    /**
     * Consumers
     */
    'consumers' => [

        /**
         * Facebook
         */
        'Facebook' => [
            'client_id'     => '',
            'client_secret' => '',
            'scope'         => [],
        ],      

    ]

];

どうでもいい話ですが、配列を[]で表現するのはとてもLaravel 5らしいです。

ここからはLaravel 5の醍醐味です。次のように設定しましょう。例ではGoogleを使うのでは、FacebookをGoogleに変更します。

<?php
return [ 

    /*
    |--------------------------------------------------------------------------
    | oAuth Config
    |--------------------------------------------------------------------------
    */

    /**
     * Storage
     */
    'storage' => 'Session', 

    /**
     * Consumers
     */
    'consumers' => [

        'Google' => array(
            'client_id'     => env('GOOGLE_CLIENT_ID'),
            'client_secret' => env('GOOGLE_CLIENT_SECRET'),
            'scope'         => ['userinfo_email', 'userinfo_profile'],
        ),       

    ]

];

Laravel 5では環境変数で秘密情報を管理しています。そうすることによって、githubに秘密情報をプッシュしなくても、開発環境か、本番環境かによって使う秘密情報を自動的に管理してくれます。

そして、プロジェクトのルートの.envファイルを開いてもらって、(もし.env.exampleになっている場合は.envにファイル名を変更してください)次の2行を増やしてくもらえます。ただし、my_google_client_idmy_google_client_secretを正しいものに変えてください。

GOOGLE_CLIENT_ID=my_google_client_id
GOOGLE_CLIENT_SECRET=my_google_client_secret

最後に、.envファイルをgithubにプッシュしないように、.gitignoreに.envを追加してください。

実行してみましょう

レポジトリに転がっているサンプルスニペットを試しました。

public function loginWithGoogle(Request $request)
{
    // get data from request
    $code = $request->get('code');

    // get google service
    $googleService = \OAuth::consumer('Google');

    // check if code is valid

    // if code is provided get user data and sign in
    if ( ! is_null($code))
    {
        // This was a callback request from google, get the token
        $token = $googleService->requestAccessToken($code);

        // Send a request with it
        $result = json_decode($googleService->request('https://www.googleapis.com/oauth2/v1/userinfo'), true);

        $message = 'Your unique Google user id is: ' . $result['id'] . ' and your name is ' . $result['name'];
        echo $message. "<br/>";

        //Var_dump
        //display whole array.
        dd($result);
    }
    // if not ask for permission first
    else
    {
        // get googleService authorization
        $url = $googleService->getAuthorizationUri();

        // return to google login url
        return redirect((string)$url);
    }
}

Laravel 5ではglobalのnamespaceをやめたので、OAuthクラスを使う際に必ず\を付けて使うことです。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
25