PHP
GitHub
OAuth

PHPで簡単にOAuth認証を実装するサンプル(例:GitHubログイン)

More than 1 year has passed since last update.

ふと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やその他設定をまとめるファイルを作っておきます。

_config.php
<?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しておくこと。

github-app-keys.php
<?php
return [
    'clientId'          => 'asdfasdfasdfasdfasdfasdf',
    'clientSecret'      => 'asdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdf'
];

(HybridAuth2系みたいにvendor/hybridauth/hybridauth/hybridauth/...となんども同じことを書かなくて良いのが楽ですね。)

OAuth認証してみる

/login.phpをログインページのURLとして、以下のように書きます。

login.php
<?php
require_once '_config.php';

// GitHubの認証画面へリダイレクトするURL取得
$authUrl = $provider->getAuthorizationUrl();

// CSRF対策のためにいまの状態を入れておく
$_SESSION['oauth2state'] = $provider->getState();

header('Location: '.$authUrl);
exit;

callback.php
<?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