技術資料

Google OAuth 2.0で実装するPHP SSO入門:Google Cloud 設定と実装コード例

作成日:2025.11.24

Google OAuth 2.0 を利用した Google アカウントによる SSO を PHP で実装する手順を解説します。Google Cloud Console での OAuth 同意画面とクライアント作成、必要なスコープ設定から、Composer の導入、GSI(Google Sign‑In)ボタンの設置、ログインスクリプトの実装例までを一貫して扱います。

前提

  • Google の OAuth 2.0 を利用した SSO 機能を PHP で実装します
  • Google API クライアントライブラリを使用します
  • Composer がインストールされていることを前提とします
  • Google Cloud のアカウントとプロジェクトが作成されていることを前提とします
  • ローカルのXAMPP環境で動作確認ができることをゴールとします
  • 処理の流れとしては、
    • https://localhost/gauth/index.html で 「Googleでログイン」ボタンを押す
    • login.php に遷移し、Google の認証画面へリダイレクトする
    • 認証後、callback.php にリダイレクトされ、アクセストークンを取得。ユーザー情報を取得して表示する
  • ローカルのXAMPP環境でhttpsを利用する手順については XAMPP環境でHTTPSを有効にする方法:Windows向けガイド などを参照

Google Cloud プロジェクトの設定

OAuth 同意画面の基本設定

Google Cloud Consoleにログインし、新しいプロジェクトを作成、または既存のプロジェクトを選択します。

画面上部の検索バーで「OAuth 同意画面」を検索し、OAuth同意画面の設定に進みます。

「開始」をクリック。

「アプリ情報」セクションで、任意のアプリ名と、サポートメールアドレスを入力します。「次へ」をクリック。

「対象」セクションでは、「外部」を選択し、「次へ」をクリックします。

「連絡先情報」セクションで、メールアドレスを入力し、「次へ」をクリックします。

「終了」セクションで、Google API サービスのプライバシーポリシー同意チェックを入れ、「続行」をクリックします。

「作成」をクリックして、OAuth 同意画面の基本設定を完了します。

OAuth クライアントの作成

OAuth 同意画面の作成が完了したら「OAuth クライアントを作成」をクリックします。

「アプリケーションの種類」で「ウェブアプリケーション」を選択し、任意の名前を入力します。

「承認済みの JavaScript 生成元」には、ローカル環境であれば https://localhost を追加します。

「承認済みのリダイレクト URI」には、https://localhost/gauth/callback.php を追加します。

作成が完了すると、完了画面にクライアントIDとクライアントシークレットが表示されます。これらは後で使用するので、コピーしてメモしておいてください。

また、「JSON をダウンロード」ボタンをクリックして、認証情報の JSON ファイルをダウンロードします。このファイルも後で使用します。

テスト用のユーザーを追加

ローカル環境でのテストを行なうためのユーザーを追加します。

左のメニューから「対象」を選択し、「テストユーザー」セクションで「Add Users」をクリック。テスト用の自分のGoogle アカウントのメールアドレスを追加します。

取得するデータのスコープを設定

Google アカウントでのログイン時に取得するデータのスコープを設定します。

左のメニューから「データアクセス」を選択し、「スコープを追加または削除」をクリックします。

取得するデータのスコープを選択します。今回は、基本的なプロフィール情報とメールアドレスを取得するために、以下のスコープを選択します。

  • auth/userinfo.email
  • auth/userinfo.profile
  • openid

取得するデータのスコープにチェックを入れたら「更新」をクリック

選択したスコープが「非機密のスコープ」に追加されていることを確認し、「保存」をクリックします。

Google Cloud Console での設定は以上です。

PHPライブラリのインストール

Google の OAuth 2.0 クライアントライブラリを Composer を使ってインストールします。ターミナルで以下のコマンドを実行してください。

composer require google/apiclient

「Google でログイン」ボタンの作成

適当な HTMLファイル index.html を作成し、 head 要素内に以下のコードを追加します。

<script src="https://accounts.google.com/gsi/client" async defer></script>

次に、body 要素内に「Google でログイン」ボタンを配置するために、以下の div 要素を追加します。

<div id="g_id_onload"
    data-client_id="YOUR_GOOGLE_CLIENT_ID"
    data-login_uri="https://localhost/gauth/login.php"
    data-auto_prompt="false">
</div>

<div class="g_id_signin"
    data-type="standard"
    data-size="large"
    data-theme="outline"
    data-text="signin_with"
    data-shape="rectangular"
    data-logo_alignment="left">
</div>

data-client_id 属性には、先ほど Google Cloud Console で取得したクライアントIDを設定します。

data-login_uri 属性には、ログイン処理を行なう PHP ファイルの URL を設定します。

これで、「Google でログイン」ボタンが表示されるようになります。

「Google でログイン」ボタンを表示方法に関する公式ドキュメントはこちら: [Google でログイン] ボタンを表示する | Authentication | Google for Developers

ボタンをカスタマイズする際には、「Google でログイン」のブランドの取り扱いガイドライン | Google Identity | Google for Developers も参照してください。

ログインリダイレクト処理の実装

次に、login.php ファイルを作成します。コードは以下のような感じ。

require_once __DIR__ . '/vendor/autoload.php';
session_start();

// Google OAuth の認証情報の JSON ファイルのパス
define('GOOGLE_CREDENTIALS_PATH', 'secret/google_oauth.json');
// OAuth 認証後のリダイレクト先 URL
define('REDIRECT_URI', 'https://localhost/gauth/callback.php');

$client = new Google_Client();
$client->setAuthConfig(GOOGLE_CREDENTIALS_PATH);
$client->setRedirectUri(REDIRECT_URI);

// OAuth 認証で取得するスコープ
$client->setScopes(['openid', 'email', 'profile']);

// state トークン生成(CSRF 対策)
$state = bin2hex(random_bytes(16));
$_SESSION['oauth2state'] = $state;
$client->setState($state);

// Google ログイン画面の URL を生成し、リダイレクト
$authUrl = $client->createAuthUrl();
header('Location: ' . filter_var($authUrl, FILTER_SANITIZE_URL));
exit;

GOOGLE_CREDENTIALS_PATH 定数には、先ほどダウンロードした認証情報の JSON ファイルのパスを設定します(※公開時には必ずWebルート外に保存すること)。

REDIRECT_URI 定数には、OAuth 認証後にリダイレクトされる PHP ファイルの URL を設定します。

これで、ユーザーが「Google でログイン」ボタンをクリックすると、Google の認証画面にリダイレクトされるようになります。

コールバック処理の実装

最後に、callback.php ファイルを作成します。コードは以下のような感じ。

require_once __DIR__ . '/vendor/autoload.php';
session_start();

// Google OAuth の認証情報の JSON ファイルのパス
define('GOOGLE_CREDENTIALS_PATH', 'secret/google_oauth.json');

$client = new Google_Client();
$client->setAuthConfig(GOOGLE_CREDENTIALS_PATH);
$client->setScopes(['openid', 'email', 'profile']);

// state トークンのチェック
if (empty($_GET['state'])) {
    error_log('state トークンがありません');
    http_response_code(400);
    die('不正なリクエストです');
}
if ($_GET['state'] !== ($_SESSION['oauth2state'] ?? '')) {
    error_log('state トークンの検証失敗: 期待値=' . ($_SESSION['oauth2state'] ?? '') . ', 実際=' . $_GET['state']);
    unset($_SESSION['oauth2state']);
    http_response_code(400);
    die('不正なリクエストです');
}
unset($_SESSION['oauth2state']);

// 認証コードのチェック
if (!isset($_GET['code'])) {
    http_response_code(400);
    die('認証コードが見つかりません');
}
if (isset($_SESSION['auth_code_used']) && $_SESSION['auth_code_used'] === $_GET['code']) {
    error_log('同じ authorization code が再利用されようとしています');
    http_response_code(400);
    die('不正なリクエストです');
}

try {
    // トークン取得
    $token = $client->fetchAccessTokenWithAuthCode($_GET['code']);
    
    if (isset($token['error'])) {
        error_log('トークン取得エラー: ' . $token['error']);
        http_response_code(401);
        die('認証に失敗しました');
    }
    
    // authorization code を記録(リプレイ攻撃防止)
    $_SESSION['auth_code_used'] = $_GET['code'];
    
    // ID トークン検証
    $idToken = $token['id_token'] ?? null;
    if (!$idToken) {
        error_log('ID トークンが返されていません');
        http_response_code(500);
        die('認証に失敗しました');
    }
    
    $payload = $client->verifyIdToken($idToken);
    if (!$payload) {
        error_log('ID トークン検証失敗');
        http_response_code(401);
        die('認証に失敗しました');
    }
    
    // メールアドレス検証の確認
    if (empty($payload['email_verified'])) {
        error_log('メールアドレスが検証されていません: ' . $payload['email']);
        http_response_code(401);
        die('メールアドレスの検証が必要です');
    }
    
    // ユーザー情報を抽出
    $user = [
        'google_id' => $payload['sub'] ?? null,
        'email' => $payload['email'] ?? null,
        'name' => $payload['name'] ?? '',
        'picture' => $payload['picture'] ?? '',
    ];
    if (!$user['google_id'] || !$user['email']) {
        error_log('必須ユーザー情報が不足しています');
        http_response_code(500);
        die('認証に失敗しました');
    }
    
    //
    // ここで DB にユーザー情報を保存したり、ログインセッションを作成したりする
    //
    
} catch (Exception $e) {
    error_log('認証処理エラー: ' . $e->getMessage());
    http_response_code(500);
    die('エラーが発生しました');
}

// ユーザー情報出力
var_dump($user);
exit;

GOOGLE_CREDENTIALS_PATH 定数には、login.php と同じく、先ほどダウンロードした認証情報の JSON ファイルのパスを設定します。

ログイン後のセッション管理や、データベースへのユーザー情報の保存などは、実際のアプリケーションの要件に応じて実装してください。

上記のコード例では、必要最低限のエラーハンドリングも含めていますが、実際の運用環境では、より詳細なエラーハンドリングやログ記録を行なうことをお勧めします。

動作確認

以上で、Google アカウントでの SSO 機能が実装されました。ローカルの XAMPP 環境で index.html にアクセスし、「Google でログイン」ボタンをクリックして動作を確認してください。

正常に動作すれば、Google の認証画面が表示され、ログイン後にユーザー情報が表示されるはずです。

まとめ

この記事では、PHP で Google アカウントを使用した SSO 機能を実装する方法について解説しました。Google Cloud Console での設定から、PHP コードの実装までの一連の流れを紹介ています。

Google の OAuth 2.0 を利用することで、ユーザーは既存の Google アカウントを使って簡単にログインでき、開発者は認証機能をスピーディに実装できます。

実際のアプリケーションでは、セキュリティ対策やユーザー管理の要件に応じて、さらにカスタマイズが必要になりますが、基本的な流れはこの記事で紹介した内容を参考にして頂けるかと思います。。

GoogleアカウントによるSSO導入をご検討中の方へ

本記事では、PHP環境でGoogle OAuth 2.0 を使ったシングルサインオン(SSO)の導入手順を、Google Cloud Consoleでの設定からログインボタン設置、コールバック処理に至るまでをざっくり解説しました。こういった機能を実装したいとお考えの方は、一度ご相談頂ければ幸いです。

このようなニーズをお持ちの方にサポートをご提供できます:

  • 既存のPHPサイトにGoogleログイン(OAuth 2.0)を導入したい
  • ログイン認証まわりの設計やセキュリティ対応をまるごと任せたい
  • ユーザー登録・認証機能を手軽に実装して、開発コストを抑えたい

「社内用管理画面やサービスにSSOを導入したい」「今後のログイン設計を見直したい」とお考えでしたら、ぜひお気軽にご相談ください。要件整理から実装、運用まで丁寧にお手伝いいたします。

mail ご相談・お問い合わせはこちらから 

この記事を書いた人

※上が私です。

奈良市を拠点に、26年以上の経験を持つフリーランスWebエンジニア、阿部辰也です。

これまで、ECサイトのバックエンド開発や業務効率化システム、公共施設の予約システムなど、多彩なプロジェクトを手がけ、企業様や制作会社様のパートナーとして信頼を築いてまいりました。

【制作会社・企業様向けサポート】
  • 専任エンジニアのいない企業様に対するシステム面の不安を解消
  • 柔軟な契約形態や短納期での対応により、急なニーズにも迅速にサポート
  • システムの企画段階から運用まで、ワンストップでのサービスを提供

Webシステムの開発やサイト改善でお困りの際は、どうぞお気軽にご相談ください。小さな疑問から大規模プロジェクトまで、最適なご提案を心を込めてさせていただきます。

ぜひ、プロフィールWeb制作会社様向け業務案内一般企業様向け業務案内もご覧くださいね。

漏洩パスワードとの照合:Pwned Passwords APIの仕組みと実運用での注意点

2025.11.06

Pwned Passwords API(Have I Been Pwned)が採用する k‑Anonymity の仕組みを分かりやすく解説し、PHPによる実装例を通して漏洩パスワードチェックの具体手順を示します。さらに、ユーザー通知文面の注意点など、実運用で押さえるべきセキュリティと運用上の留意点をまとめています。

PHP Pwned Passwords API

Composerオートローダーでの「Class not found」エラー対処法

2025.10.18

Composerを利用してPHPライブラリをインストールした後に発生する「Class not found」エラーの原因と、その対処法について解説しています。特に、オートローダーの設定が正しく機能していない場合の具体的なエラー例を基に手順を紹介。

Composer PHP

PHPで実現するCloud Vision API OCR入門:画像からテキスト抽出の基本

2025.09.30

Google Cloud Vision API を利用して、PHP で画像からテキストを抽出する OCR 処理の基本的な実装方法を解説します。API の有効化や認証情報の取得、PHP クライアントライブラリのインストール手順から、実際のコード例に基づいた OCR 処理の流れを紹介。

Cloud Vision API PHP

onelogin/php-samlで実現するPHP SAML認証:基本設定から動作確認まで

2025.09.25

軽量ライブラリである onelogin/php-saml を利用して、PHPでSAML認証を実装する方法を詳しく解説します。Composerによるインストールから、証明書・秘密鍵の準備、設定ファイルの作成、そしてSPのメタデータ生成やSSO・ACSの各スクリプトまで、SAML認証の基本設定と動作確認の一連の流れをサンプルコードを交えて紹介。

onelogin/php-saml PHP SAML認証

阿部辰也へのお仕事の依頼・お問い合わせ

軽いご相談もお気軽にどうぞ!

個人情報の取り扱いについて *必須 プライバシーポリシーをご確認いただき、同意いただける場合は「同意する」にチェックをしてください。

keyboard_double_arrow_up
TOP