PHPでGoogleログインの実装をする方法(2023年11月時点動作)

本記事は、[めんどい太郎の Advent Calendar 2023](https://qiita.com/advent-calendar/2023/mendoitarou_first_calendar) 1日目の記事です。

# はじめに

この記事は初心者が書いています。

皆さんは普段、様々なサービスにどのようにしてログイン・登録していますか？

今話題のPass Keyを使っている方や、登録したIDとパスワードを使用する人など様々だと思います。

そんなログイン・登録であると非常に便利なのがSNSログインです。

今回はそんなSNSログインの一つである「Googleでログイン」の実装方法をご紹介いたします。

正直、Googleのドキュメントはめちゃくちゃわかりやすいので[公式ドキュメント](https://developers.google.com/identity/gsi/web/guides/overview?hl=ja)を読んで見ることをおすすめします。

案外仕様変更が行われていたりします。

:::note info
2023年にGoogleログインが非推奨になり、廃止されました。
この記事は2023/11時点でサポートされている新しいGoogleでログインの記事です。
:::


# Googleでログインについて

皆さんは画像のような画面、見たことありませんか？

![Qiita_login_01](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388444/5dcc379e-3313-2adf-db7b-003df587f37e.png)

(スクリーンショット撮影ページ[^1])

これはQiitaのログインページなのですが、QiitaにもGoogleでログインする機能が実装されています。

Googleは使用しているユーザーが多いので、SNSログインで一番使われやすい方法だと思います。

ユーザーもGoogleアカウントにログインするだけで、登録・ログインすることができるため手間がかからず便利です。

GoogleはOne Tapというメニューからログイン済みのアカウントを選択するだけでログイン可能というその名の通りワンタップでログインできる機能を提供しています。

ユーザーはログイン・登録の手間が非常に少なくなるため、Googleでログインの実装は新規ユーザー獲得のためにも非常に有効だと思われます。

# 実装
## 環境
- PHP 8.2

## GoogleCloudPlatformの設定

Googleでログインはfirebaseというサービスを利用するとお手軽に実装できるという記事がたくさん出てきますが、PHPは公式にサポートされていません。(サードパーティのライブラリはある)

今回は、APIを利用した方法で実装していきます。

APIを利用するために、GoogleCloudPlatformを使用します。

### プロジェクトの作成

[GoogleCloudPlatform](https://console.cloud.google.com/welcome?hl=ja)のコンソールにアクセスし、プロジェクトを作成します。

![Create_Project.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388444/6a46f097-7249-bed5-b8a7-45e99fd5a96e.png)

### 同意画面の作成

プロジェクトのトップ画面に向かい、「APIとサービスページ」に移動します

![Project_Top.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388444/c7ffd182-da4e-091d-f75a-961ea8a1e5d0.png)

(大抵下にあります)

メニューから「OAuth consent screen」を選択します

![api_and_service_menu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388444/dfb731a4-71b1-0ba3-2ded-582c5998f4e3.png)

ユーザータイプを選択します。

大抵の場合は**外部**です。

![select_user_type.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388444/cf713fad-09d1-a209-533e-a593979f4896.png)

アプリの詳細情報を入力します。

![input_application_info.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388444/ac0b493a-905e-5f33-d5f2-12d54258eec5.png)

スコープを追加します。

画像の3つのスコープを追加しておけば大丈夫だと思います。

![add_scope.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388444/d7df6a7a-66b0-4b4a-b44a-e98fe27fa48c.png)

テストユーザーとして自分を追加します。

![add_test-user.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388444/67a61b49-1d49-f8f5-3d35-735c9cd99bca.png)

完了です。

:::note info
本番環境に持っていくときに、GoogleCloudPlatform上でアプリを公開するのを忘れないでください。
![app_oauth_consent_screen_info.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388444/60c3462d-9b59-d608-69f1-f0bf50f16de9.png)
:::

### OAuthクライアントIDを作成する

メニューから「認証情報」を選択します

![api_and_service_menu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388444/dfb731a4-71b1-0ba3-2ded-582c5998f4e3.png)

「認証情報を作成」から「OAuth クライアント ID」を選択します。

![info_create.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388444/78a674de-3580-2ea5-ae8d-f4ad1eecd6bd.png)

アプリケーションの種類を「ウェブアプリケーション」にし、わかりやすい名前をつけます。(テスト環境など)

![info_application_type.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388444/6ca369d4-d4e3-fc93-d71b-453e5cc63284.png)

ドメインとリダイレクトURIを登録します。

![input_domain_and_redirect_uri.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388444/8dc99b79-a743-7436-4095-9c336d17b010.png)

表示されたクライアントIDをメモしておきます。

![Create_Client_ID_Info.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388444/9af8355a-0703-6c4f-186f-60fa66063149.png)

## ライブラリのインストール
### composerのインストール

共用のレンタルサーバーなどでも、composerは利用可能です。

composerの公式サイトを参考にインストールをします。

```shell
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === 'e21205b207c3ff031906575712edab6f13eb0b361f2085f1f1237b7126d785e826a450292b6cfd1d64d92e6563bbde02') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
```

参考記事[^2]を参考にし、ユーザーディレクトリ内にインストールを行います。

```shell
mkdir ~/bin
mv composer.phar ~/bin/composer
```

最後に、composerのバージョンを確認しインストールできているかを確認します。

```shell
composer --version
```

バージョンが表示されれば、インストール完了です。

### ライブラリのインストール・設定

public_htmlの中など、googleログインを扱うファイルの存在するディレクトリに移動します。

composerを使用して、ライブラリをインストールします。

```shell
composer require google/apiclient
```


## ログインページを作成する
### Googleのツールを用いてログインボタンを作る

まずはクライアントライブラリを読み込みます。

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

body内のログインボタンのコードの直前で構いません。

Googleが公開しているツールを用いて、お好みでボタンを作成します。

:::note info
「JavaScript コールバックに切り替え」をクリックせずに、ログイン後はリダイレクト処理を行わせてください。
ログインURIにphpまでのURIを入力してください。
:::

[HTML コードを生成](https://developers.google.com/identity/gsi/web/tools/configurator?hl=ja)

生成したコードを自身のサービスのログインページに貼り付けます。

以下は例です。

```html
<html>
  <head>
    <meta charset="UTF-8">
    <title>TEST_GOOGLE_LOGIN</title>
  </head>
  <body>
    <h1>Googleでログイン</h1><br>
    <script src="https://accounts.google.com/gsi/client" async></script>
    <div id="g_id_onload"
     data-client_id="{Your_Client_ID}"
     data-context="signin"
     data-ux_mode="popup"
     data-login_uri="{Your_Login_Redirect_URI}"
     data-nonce=""
     data-itp_support="true">
    </div>
    <div class="g_id_signin"
     data-type="standard"
     data-shape="rectangular"
     data-theme="outline"
     data-text="signin_with"
     data-size="large"
     data-logo_alignment="left">
    </div>
  </body>
</html>
```

### PHPでデータを受け取る

PHP側はこちらの記事[^3]を参考にしました。

新しいGoogleでログインはJWTが返ってくるので、それを受け取ります。

そのため、少しだけコードが変わります。

以下は例です。

```PHP
<?php 
require_once 'vendor/autoload.php';

$id_token = $_POST['credential'];
define('CLIENT_ID', '{Your_Client_ID}');

$client = new Google_Client(['client_id' => CLIENT_ID]); 
$payload = $client->verifyIdToken($id_token);
if ($payload) {
  $userid = $payload['sub'];
}
?>
```

これでGoogleでログインの実装は完了です。

思ったより簡単ですね！

あとは、``if ($payload)``の中身に自分で処理を書けばOKです。

# おわりに

Googleでログインを適切に実装できれば、それだけでかなり便利になると思います。

Googleさん、ありがとうございます。

バグなども多いかもしれません。ご指摘いただけるとありがたいです。

# 注釈

[^1]:[Google for Developer](https://developers.google.com/identity/gsi/web/guides/overview?hl=ja)
[^2]:[お名前.com レンタルサーバーで Laravel を動かす](https://gn-office.pro/archives/556)
[^3]:[WEBページに「Googleアカウントでログイン」を実装する](https://qiita.com/kmtym1998/items/768212fe92dbaa384c27)