ふとGitHubログインを実装しようとしたのだが、調べてもあまり使いやすそうなライブラリがない。
OpauthやHybridAuthなどの記事が多かったが、Opauthは既に開発が止まっているみたいだし、HybridAuthも2系はcomposer使うと非常に面倒くさく、3系はまだ開発中。
そこでleague/oauth2-clientというよさそうなライブラリを発見したので、これで実装することに。ついでにサンプルも作ってみた。
thephpleague/oauth2-github
https://github.com/thephpleague/oauth2-github
ドキュメントページもちゃんとあります。
OAuth 2 Client - Easy integration with OAuth2 service providers
http://oauth2-client.thephpleague.com/
インストールと設定
はじめにGitHubのここでApplicationをregisterしてClient IDとClient Secretを取得しておきましょう。callbackのurlはここでは/callback.php
とします。
composerで入れます。
$ composer require league/oauth2-client league/oauth2-github
oauth2-clientはproviderごとのpackageも別にインストールする形になっています。
今回はGitHubログインなのでこれも入れる。GitHubは公式のプロバイダとなっているので安心できる。
あとautoloadやその他設定をまとめるファイルを作っておきます。
<?php
require_once './vendor/autoload.php';
session_start();
$github_keys = require('./github-app-keys.php');
$provider = new League\OAuth2\Client\Provider\Github([
'clientId' => $github_keys['clientId'],
'clientSecret' => $github_keys['clientSecret'],
]);
$title = "PHP GitHub Login Sample";
GitHubのclientIdとclientSecretはさっき作成したものを入れておきます。github-app-keys.php
は必ずgitignoreしておくこと。
<?php
return [
'clientId' => 'asdfasdfasdfasdfasdfasdf',
'clientSecret' => 'asdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdf'
];
(HybridAuth2系みたいにvendor/hybridauth/hybridauth/hybridauth/...
となんども同じことを書かなくて良いのが楽ですね。)
OAuth認証してみる
/login.php
をログインページのURLとして、以下のように書きます。
<?php
require_once '_config.php';
// GitHubの認証画面へリダイレクトするURL取得
$authUrl = $provider->getAuthorizationUrl();
// CSRF対策のためにいまの状態を入れておく
$_SESSION['oauth2state'] = $provider->getState();
header('Location: '.$authUrl);
exit;
<?php
require_once '_config.php';
// ちゃんとlogin.phpからきたかどうか確認
if (empty($_GET['state']) || ($_GET['state'] !== $_SESSION['oauth2state'])) {
unset($_SESSION['oauth2state']);
exit('Invalid state');
}
// 認証コードからアクセストークンを取得
$token = $provider->getAccessToken('authorization_code', [
'code' => $_GET['code']
]);
echo $token.'\n';
echo 'Successfully callbacked!!'.'\n';
// トークン使って認可した情報を取得できる
$user = $provider->getResourceOwner($token);
echo '<pre>';
var_dump($user);
echo '</pre>';
おわりに
いいライブラリあると結構楽ですね。
ここで書いたコードはGitHubにも上げておきました。
ikuwow/php-github-login
https://github.com/ikuwow/php-github-login