search
LoginSignup
68

More than 5 years have passed since last update.

posted at

updated at

Organization

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

ふと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

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
68