1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PHP ウェブサイトで Google 認証する

1
Posted at

はじめに

友人(@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

認証処理する準備します。

login.php
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 を指定します。

ログイン画面を用意する

ログイン画面を用意します。

login.php
<form method="get" action="oauth.php">
    <button type="submit" name="login">Google でログイン</button>
</form>
<p><?= $message ?></p>

「ログイン」ボタン押下すると、パラメータ login をつけて login.php を呼出します。

認証処理を開始する

呼出されたら、認証処理を開始します。

login.php
if (isset($_GET['login'])) {
    try {
        $hybridauth->authenticate('Google');    // 認証処理を開始
    } 
    catch (Exception $e) {
        $message = "Error: " . $e->getMessage();
    }
}

authenticate() すると Google のログイン画面が開きます。

コールバック URL を用意する

ユーザが Google で認証処理すると、事前に登録しておいた URL に戻ってきます。戻ってきたときの処理を用意します。

login.php
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 に設定します。

認証情報をセッションに保存する

認証成功したとき、その情報をセッションに保存します。

login.php
session_start();  // セッション開始
(中略)
        $profile = $adapter->getUserProfile();    // ユーザー情報を取得

        $_SESSION['user'] = [    // セッションにユーザ情報をセット
            'username'  => $profile->displayName,
        ];

認証情報がセッションに保存されていれば、認証済だと判断できます。

if (isset($_SESSION['user'])) {    
    // 認証されている
}

どのページでも認証確認する

これまでのコードでは、ログイン画面以外のページでは認証確認されません。どのページでも、認証されているか確認するようにしましょう。

◇◇.php
session_start();    // セッション開始

if (!isset($_SESSION['user'])) {    // 認証されていない
    header('Location: /login.php');    // ログインページへリダイレクト
    exit;
}
1
0
0

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
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?