ウェブの [Google でログイン] ボタン

1. 概要

この Codelab では、ユーザー ログイン用のウェブページを作成します。Google Identity Services JavaScript ライブラリを使用して、[Google でログイン] ボタンを表示し、カスタマイズします。

[Google でログイン] ボタン。

学習内容

  • ウェブページに「Google でログイン」ボタンを追加する方法
  • OAuth 2.0 ウェブ アプリケーションの設定方法
  • ID トークンをデコードする方法
  • [Google でログイン] ボタンをカスタマイズする方法

必要なもの

  1. テキスト エディタとウェブページをホストする場所。この Codelab で取り上げる環境は次のとおりです。
    • マシンのターミナルでローカルに実行する。
    • Glitch などのプラットフォームを使用します。
    使いやすいと思う環境を選択します。
  2. Google Cloud プロジェクト 既存のプロジェクトを使用することも、新しいプロジェクトを作成することもできます。Google Cloud Platform のアカウントとプロジェクトは無料です。
  3. HTML、CSS、JavaScript、Chrome DevTools(または同等のツール)に関する基本的な知識。

では始めましょう。

2. ログインページを作成する

次のコードサンプルを index.html というファイルに追加します。この作業は、お使いのマシンでテキスト エディタを使用するか、Glitch などのプラットフォームで行うことができます。

<!DOCTYPE html>
<html lang="en">
  <head>
    <script src="https://accounts.google.com/gsi/client" async></script>

    <script>
      function decodeJWT(token) {

        let base64Url = token.split(".")[1];
        let base64 = base64Url.replace(/-/g, "+").replace(/_/g, "/");
        let jsonPayload = decodeURIComponent(
          atob(base64)
            .split("")
            .map(function (c) {
              return "%" + ("00" + c.charCodeAt(0).toString(16)).slice(-2);
            })
            .join("")
        );
        return JSON.parse(jsonPayload);
      }

      function handleCredentialResponse(response) {

        console.log("Encoded JWT ID token: " + response.credential);

        const responsePayload = decodeJWT(response.credential);

        console.log("Decoded JWT ID token fields:");
        console.log("  Full Name: " + responsePayload.name);
        console.log("  Given Name: " + responsePayload.given_name);
        console.log("  Family Name: " + responsePayload.family_name);
        console.log("  Unique ID: " + responsePayload.sub);
        console.log("  Profile image URL: " + responsePayload.picture);
        console.log("  Email: " + responsePayload.email);
      }
    </script>
  </head>
  <body>
    <!-- g_id_onload contains Google Identity Services settings -->
    <div
      id="g_id_onload"
      data-auto_prompt="false"
      data-callback="handleCredentialResponse"
      data-client_id="PUT_YOUR_WEB_CLIENT_ID_HERE"
    ></div>
    <!-- g_id_signin places the button on a page and supports customization -->
    <div class="g_id_signin"></div>
  </body>
</html>

このコードは HTML と JavaScript が混在しており、次の処理を行います。

  • g_id_onload を使用して Google Identity Services ライブラリを構成します。
  • g_id_signin を使用して [Google でログイン] ボタンを表示する
  • Google からユーザーのログイン認証情報を受け取る handleCredentialResponse という名前の JavaScript コールバック関数ハンドラを追加します。
  • JSON Web Token(JWT)認証情報をプレーンな JSON に変換する decodeJWT 関数。

data-client_id="PUT_YOUR_WEB_CLIENT_ID_HERE" には少し問題があるように見えるかもしれません。

今は無視してください。後ほど説明します。

3. ウェブページを配信する

ブラウザに index.html を配信する 2 つの環境について説明します。

  • マシンでローカルにウェブサーバーを実行している
  • Glitch などのリモート プラットフォーム。

使いやすいと思う方を選んでください。設定後、この URL を使用して OAuth ウェブ クライアントを構成します。

マシンからローカルに

システムに Python3 がインストールされていることを確認します。設定は OS とプラットフォームによって異なります。マシンに Python をインストールする必要がある場合は、Python の設定と使用から始めます。

index.html を含むディレクトリで Python ウェブサーバーを起動します。

$ python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...

ウェブサーバーがポート 8000 で接続をリッスンし、ログインページを提供する準備が整いました。URL は

http://localhost:8000

ウェブ開発プラットフォームから

Glitch(または同等のもの)を使用してログインページを編集してホストすることを選択した場合は、プレビュー ペインまたは新しいブラウザタブで index.html を開くことができます。

通常、使用する URL は、glich.com プロジェクトの設定時に入力したプロジェクト名です。たとえば、Glitch プロジェクトの名前が gis-example の場合、URL は https://gis-example.glitch.me になります。もちろん、別のプロジェクト名を選択しているため、この名前を再利用することはできません。URL は

https://<var>your-project-name</var>.glitch.me

ページを読み込む

少々お待ちください...

まず、OAuth 2.0 ウェブ クライアントを作成して構成する必要があります。

URL をコピーするかメモします。これは次の手順で使用します。

4. OAuth ウェブ クライアントを設定する

ユーザーが実際にログインできるように OAuth を構成しましょう。

  • このリンクをクリックして、OAuth 2.0 ウェブ クライアントを作成します。必要に応じて、ウィザードを使用して新しい Google Cloud プロジェクトを作成して設定します。
  • [アプリケーションの種類] プルダウンから [ウェブ アプリケーション] を選択します。
  • [承認済みの JavaScript 生成元] の [URI を追加] ボタンを押します。
  • ステップ 3: ウェブページを配信するindex.html をホストしている URL を入力します。

    ローカルマシンでホストされている

    マシンでホストされるローカル オリジン

    リモート プラットフォームでホストされている

    リモート ホスティング プラットフォームを使用する
  • [作成] を押します。
  • 新しいクライアント ID をコピーします。

ASMRの要素も忘れてはならないでしょう

新しいクライアント ID を使用するように index.html を更新する必要があります。エディタで、PUT_YOUR_WEB_CLIENT_ID_HERE を新しいクライアント ID に置き換えます。クライアント ID は次の例のようになります。1234567890-abc123def456.apps.googleusercontent.com

ログインしましょう。

5. ログイン

まず、ブラウザのデベロッパー コンソールを開きます。Google から返されたエラーと JWT ID トークン認証情報がここに記録されます。

[Google でログイン] ボタンを押します。

その後の流れは多少異なる場合があります。

  • 現在複数の Google アカウントにログインしている場合は、このウェブアプリへのログインに使用するアカウントを選択するよう求められます。
  • このウェブアプリに初めてログインする場合は、同意を求めるメッセージが表示されます。

必要に応じてアカウントを選択して同意すると、Google は JWT で応答します。ブラウザで実行されている handleCredentialResponse コールバック関数が JWT を受け取ります。

この Codelab では、JWT の内容をデコードして出力します。本番環境のウェブアプリでは、デコードされた JWT を検証して、バックエンド プラットフォームに新しいアカウントを作成したり、ユーザーの新しいセッションを確立したりするなど、より意味のある処理を行います。

6. JWT ID トークンを検査する

エンコードされた JWT がデベロッパー コンソールに記録されます。JWT のデコード後、一般的に使用される ID トークン フィールドの一部もコンソールに記録されます。

jwt.io などのオンライン ツールを使用して、JWT をデコードできます。

または、ターミナルの jq を使用して JWT をデコードして表示することもできます(パッケージ マネージャーを使用して jq をインストールする必要がある場合があります)。まず、エンコードされた JWT 文字列を二重引用符で囲んで貼り付けます。

$ JWT="eyJhbGciOiJSUzI1Ni ... Hecz6Wm4Q"

このコマンドを使用してデコードします。

$ echo $JWT | jq -R 'split(".") | .[0],.[1] | @base64d | fromjson'
{
  "alg": "RS256",
  "kid": "c7e04465649ffa606557650c7e65f0a87ae00fe8",
  "typ": "JWT"
}
{
  "iss": "https://accounts.google.com",
  "azp": "123456789012-s0meRand0mStR1nG.apps.googleusercontent.com",
  "aud": "123456789012-s0meRand0mStR1nG.apps.googleusercontent.com",
  "sub": "2718281828459045",
  "email": "example@example.com",
  "email_verified": true,
  "nbf": 1744645148,
  "name": "Brian Daugherty",
  "picture": "https://lh3.googleusercontent.com/a/08a898b88ca4d6407be652d8",
  "given_name": "Brian",
  "family_name": "Daugherty",
  "iat": 1744645448,
  "exp": 1744649048,
  "jti": "52cd32984b30e178aa88bc2e75e63e055a461fcf"
}

メール、名前、写真などのキーと値は、比較的わかりやすいはずです。他の値は、JWT を使用する前に検証するために使用されます。各フィールドの意味について詳しくは、ID トークンからユーザー情報を取得するをご覧ください。

7. ボタンをカスタマイズする

デフォルトのログインボタンをページに配置する方法は次のとおりです。

    <div class="g_id_signin"></div>

このボタンが表示されます。

[Google でログイン] ボタン。

ただし、サイトのテーマに合わせて色、サイズ、テキストを変更したい場合もあるでしょう。

ボタンの色を青に変更し、代わりに「Google で登録」と表示されるようにしましょう。

index.html を開き、g_id_signin 要素を見つけて、data-theme="filled_blue" 属性と data-text="signup_with" 属性を追加します。

    <div
      class="g_id_signin"
      data-theme="filled_blue"
      data-text="signup_with"
    ></div>

保存してページを再読み込みすると、新しいテキストを含む青いボタンが表示されます。

[Google で登録] ボタン。

ボタンはさらにカスタマイズできます。オプションの完全なリストについては、Visual Data 属性をご覧ください。また、HTML コード生成ツールもお試しください。

8. 参考情報

お疲れさまでした

ウェブページに [Google でログイン] ボタンを追加し、OAuth 2.0 ウェブ クライアントを構成し、JWT ID トークンをデコードし、ボタンの外観をカスタマイズする方法を学びました。

次のリンクが、次のステップの参考になる可能性があります。

よくある質問