Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
67
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

@ikuwow

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
67
Help us understand the problem. What are the problem?