Help us understand the problem. What is going on with this article?

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

More than 3 years have 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

ikuwow
いろんなことをしているWebエンジニアです
https://ikuwow.github.io
bm-sms
高齢社会に適した情報インフラを構築することで価値を創造し社会に貢献し続ける
https://www.bm-sms.co.jp/
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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした