SOFTELメモ Developer's blog

Googleでログインの実装

問題

「Googleでログイン」の機能を作りたいです。

答え

Googleの機能を使うので、

Google Cloud Console へアクセス

プロジェクトを作成

クライアント作成のページへ https://console.cloud.google.com/auth/clients

クライアントIDとクライアントシークレットを作成する

origin、redirect先を設定する

古い方法

https://developers.google.com/identity/sign-in/web/sign-in

この形式でボタンを設定するのは古い方法だった。

<div class="g-signin2" data-onsuccess="onSignIn"></div>

システム側はログイン画面に指定のJavaScript、metaタグ、button を追加
<script src="https://apis.google.com/js/platform.js" async defer></script>

ログインした後の処理を実装する
function onSignIn(googleUser) { /* ~~~ */ }
JavaScriptでIDやemailが取得できるが、システムのログインに使用するなら id_token を送って、バックエンドで検証すること。
https://developers.google.com/identity/sign-in/web/backend-auth

最新の方法

https://developers.google.com/identity

ログインURLに遷移するタイプの場合

以下のようなHTMLを追加するとボタンが表示され、トークンを付与してログインURLに移動する。

<div id="g_id_onload"
   data-client_id="YOUR_GOOGLE_CLIENT_ID"
   data-context="signin"
   data-ux_mode="redirect"
   data-login_uri="https://your.domain/your_login_endpoint"
   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>

コールバックに渡してほしい場合

ボタンは以下のように data-callback 属性を指定して、コールバック関数でレスポンスを処理する。

<div id="g_id_onload"
  data-client_id="YOUR_GOOGLE_CLIENT_ID"
  data-callback="YOUR_CALLBACK_HANDLER"
</div>

COOP(Cross-Origin-Opener-Policy)の設定によっては、コールバック方式はエラーになることがある。その場合は、Cross-Origin-Opener-Policyの設定をするか、リダイレクト方式に変更する。

トークンの検証などバックエンドの処理に使用するライブラリ

composer require google/apiclient

トークンから取得できる情報

Google_Client の verifyIdToken($トークン) で取得できる情報の例は以下の通り。

subが一意のID。emailや、GoogleWorkspaceならdomainなども取得できる。

{
 // These six fields are included in all Google ID Tokens.
 "iss": "https://accounts.google.com",
 "sub": "110169484474386276334",
 "azp": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
 "aud": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
 "iat": "1433978353",
 "exp": "1433981953",

 // These seven fields are only included when the user has granted the "profile" and
 // "email" OAuth scopes to the application.
 "email": "testuser@gmail.com",
 "email_verified": "true",
 "name" : "Test User",
 "picture": "https://lh4.googleusercontent.com/-kYgzyAWpZzJ/ABCDEFGHI/AAAJKLMNOP/tIXL9Ir44LE/s99-c/photo.jpg",
 "given_name": "Test",
 "family_name": "User",
 "locale": "en"
}

この後は

対象システムのユーザーとGoogleアカウントをどうやって紐づけるか?の問題がある。

ユーザー登録させてよいシステムなら、新しいユーザーは登録までするのもあり。

業務システムなら登録済みのユーザーしか受け付けないのもあり。

登録済みのユーザーとの紐づけは、簡単に、メールアドレス(=Googleのアカウント)が一致したら本人としてよいシステムならばそれもあり。

対象のシステムにログイン状態にしてからGoogleのアカウントのID(sub)と紐づけたり切り離したりできるところまで作るのもあり。

関連するメモ

コメント