はじめに
Laravel5はLaravel4に比べて互換性がないと言ってもいいほど大部変わっています。
今回は試しに今まで使っていたartdarek/oauth-4-laravelのOAuthライブラリを使ってLaravel5にインストールしてみました。
と!その前に、先ほど話したようにLaravel5とLaravel4の互換性はないと言ってもいいほど大部違うので、そんな簡単にインストールできるはずはありません。まず、artdarek/oauth-4-laravelのissueをLaravel 5
というキーワードで検索してどんな問題があったかを探ってみました。
きたああ!!!やっぱりそういう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_id
とmy_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クラスを使う際に必ず\
を付けて使うことです。