はじめに
友人(@digital24s さん)と一緒にウェブサイトのリニューアルを検討しています。ログインが必要なページを作りたいと相談されました。
以前に Node.js+Express+Passport で Google 認証してみたことがあります。
Node.js+Passport+Google 認証を使ってみた #JavaScript - Qiita
友人のウェブサイトは PHP が実行できるレンタルサーバで運用したいので、PHP プログラムで実装したいと思います。
PHP ウェブサイトで Google 認証する
Google で認証するようにしたいと思います
シンプルなOAuth認証ライブラリ「HybridAuth」を試してみた - Mach3.laBlog
Google 認証を使うための事前の準備
Google 認証を使うために、Google Cloud サービスで事前に準備しておきます。
①開発者の Google アカウントで Google Developer Console にログインします。
(https://console.cloud.google.com/)
②認証に使うプロジェクトを作成します。プロジェクト名は任意です。
(https://console.developers.google.com/project)
参照 Google APIを使用するための設定(プロジェクトの作成 ・ 使用するAPIの設定) 第1回 - プログラミングノート
③Google 認証するために必要な API を有効にします。
(https://console.developers.google.com/apis/library)
Google+ API を有効にしておきます。
参照 Google API を有効にする | MAGELLAN BLOCKS
④認証情報を作成します。
(https://console.developers.google.com/apis/credentials)
認証情報は OAuth クライアント ID を作成します。以下の項目を設定します。
- アプリケーションの種類
ウェブアプリケーション - 名前 ←任意です
- JavaScript 生成元 ←設定は不要
- リダイレクト URI ←後述の通り
「作成」すると、以下の情報が取得できます。後で使用します。
- クライアント ID
- クライアントシークレット
参照 Google APIを使用するための設定(認証情報の登録) 第2回 - プログラミングノート
ライブラリを導入して認証処理の準備する
HybridAuth ライブラリを使います。
Hybridauth Social Login PHP Library
ライブラリをインストールします。
$ composer require hybridauth/hybridauth
認証処理する準備します。
require 'vendor/autoload.php';
use Hybridauth\Hybridauth;
$hybridauth = new Hybridauth([
'providers' => [
'Google' => [
'enabled' => true,
'keys' => [
'id' => '(クライアント ID)',
'secret' => '(クライアントシークレット)'
],
'scope' => 'email profile',
'callback' => '(リダイレクト URI)',
],
],
]);
事前に設定した クライアント ID 、クライアントシークレット 、リダイレクト URI を指定します。
ログイン画面を用意する
ログイン画面を用意します。
<form method="get" action="oauth.php">
<button type="submit" name="login">Google でログイン</button>
</form>
<p><?= $message ?></p>
「ログイン」ボタン押下すると、パラメータ login をつけて login.php を呼出します。
認証処理を開始する
呼出されたら、認証処理を開始します。
if (isset($_GET['login'])) {
try {
$hybridauth->authenticate('Google'); // 認証処理を開始
}
catch (Exception $e) {
$message = "Error: " . $e->getMessage();
}
}
authenticate() すると Google のログイン画面が開きます。
コールバック URL を用意する
ユーザが Google で認証処理すると、事前に登録しておいた URL に戻ってきます。戻ってきたときの処理を用意します。
if (isset($_GET['callback'])) { // 認可サーバから戻ってきた
try {
$adapter = $hybridauth->authenticate('Google'); // 認証プロセスを完了させ、アダプターを取得
$profile = $adapter->getUserProfile(); // ユーザー情報を取得
$message = "認証成功";
}
catch (Exception $e) {
$message = "Error: " . $e->getMessage();
}
このページをブラウザで開く URL は↓
http://(サーバのアドレス)/login.php?callback
これを前述の OAuth クライアント の リダイレクト URI に設定します。
認証情報をセッションに保存する
認証成功したとき、その情報をセッションに保存します。
session_start(); // セッション開始
(中略)
$profile = $adapter->getUserProfile(); // ユーザー情報を取得
$_SESSION['user'] = [ // セッションにユーザ情報をセット
'username' => $profile->displayName,
];
認証情報がセッションに保存されていれば、認証済だと判断できます。
if (isset($_SESSION['user'])) {
// 認証されている
}
どのページでも認証確認する
これまでのコードでは、ログイン画面以外のページでは認証確認されません。どのページでも、認証されているか確認するようにしましょう。
session_start(); // セッション開始
if (!isset($_SESSION['user'])) { // 認証されていない
header('Location: /login.php'); // ログインページへリダイレクト
exit;
}