Google サインインによる認証は、最新のアプリケーションでは一般的な方法です。このブログ記事では、 Ruby on Railsをサーバーとして使用するフロントエンド アプリケーションに Google Identity Services を統合する方法について説明します。 Google ID サービスが提供するもの
カスタマイズされたサインイン/サインアップ ボタン
ワンタップサインイン
飛び込みましょう!!
Google サインインまたはワンタップを使用するには、クライアントとサーバーに追加するclient_idが必要です。
アプリケーションを作成するには、
[資格情報の作成] > [OAuth クライアント ID]を選択します。これを行う前に、設定する必要があります
client_id を作成するときは、必ずlocalhostとクライアントが実行されているポートを、開発用の承認済み Javascript オリジンと本番 URL に含めてください。
完了すると、 1234567890-abcdefg.apps.googleusercontent.com
の形式のclient_idが作成されます。
アプリケーションのセットアップの詳細については、次を参照してください。
クライアント ライブラリをロードするには、 React.jsまたは_app.jsx
を使用している場合は、 index.html
に<script src="https://accounts.google.com/gsi/client" async defer></script>
を追加します。 _app.jsx
を使用する場合はjsx。
useEffect(() => { /* global google */ google.accounts.id.initialize({ client_id: "YOUR_GOOGLE_CLIENT_ID", callback: signInCallback, cancel_on_tap_outside: false, }); google.accounts.id.renderButton(document.getElementById("signInDiv"), { theme: "outline", size: "large", }); }, []);
global googleは、google がindex.html
でグローバルに定義されていることを示すために追加されます。
google.accounts.id.initialize
メソッドは、指定されたフィールドに基づいて Sign In With Google クライアント インスタンスを作成します。 client_idは、Google アプリケーションの作成時に取得する必須フィールドです。 callbackは、One Tap プロンプトまたはポップアップ ウィンドウから返された ID トークンを処理する JavaScript 関数 (ここではsignInCallback ) です。
デフォルトでは、ユーザーが画面上の任意の場所をクリックすると、ワンタップ プロンプトに指数関数的なクールダウンが適用されます。プロンプトを常に表示する場合は、この値をfalseに設定します。より多くの構成を見ることができます
google.accounts.id.renderButton
メソッドは、[Google でサインイン] ボタンをレンダリングします。構成をいじることができます
document.getElementById("signInDiv")
は HTML 要素です。以下のコードを Web ページの HTML に追加すると、
return ( <div className="App"> <div id="signInDiv" /> </div> );
このようなカスタマイズされたボタンが表示されます
google.accounts.id.prompt();
に追加します。 const signInCallback = (result) => { if (result.credential) { const params = { token: result.credential }; axios .post("http://localhost:3000/user/google", params) .then((res) => { const { authToken, ...userInfo } = res.data.data; // set token in local storage/cookies based on your authentication method // redirect to the authenticated page }) .catch((err) => console.log(err)); } };
どこ、
[サインイン] または [ワンタップ] ボタンをクリックすると、結果は Google からの応答になります。
結果は 2 つのフィールドで構成されます
credential : このフィールドは、base64 でエンコードされた JSON Web トークン (JWT) 文字列としての ID トークンです。
select_by : 資格証明の選択方法を示します。詳しくは
結果から資格情報を取得し、それをパラメーターとしてサーバーに渡します。
クライアントからのリクエストを処理するために、サーバーにルートを作成します。その前に、クライアントから JWT を受け入れるコントローラーを作成する必要があります。
ファイルapp/controllers/users/user_controller.rb
を作成し、メソッドgoogle
を追加します。
config/routes.rbにルートusers/user#google_oauthを追加します。
ルートが JWT を受け取ると、最初の最も重要なステップは、JWT が検証されているかどうかを確認することです。この目的のために、gem を使用できます。
これは、を使用して簡単に行うことができます
Google::Auth::IDTokens.verify_oidc access_token, aud: "YOUR_GOOGLE_CLIENT_ID"
ここで、 access_tokenはクライアントから受信した JWT であり、 audは Google アプリケーションのクライアント ID です。
{ "iss": "https://accounts.google.com", "nbf": 12345678, "aud": "YOUR_GOOGLE_CLIENT_ID, "sub": "1112223333444", "email": "[email protected]", "email_verified": true, "azp": "YOUR_GOOGLE_CLIENT_ID", "name": "First Last", "picture": "https://lh3.googleusercontent.com/a/AItbvmnvsIQFJw", "given_name": "First", "family_name": "Last", "iat": 1653797115, "exp": 1653805725, "jti": "8ffa19190gngd46745ff558821f953802" }
トークンが有効な場合は、ユーザーが存在するかどうかをデータベースで確認し、それに応じてユーザーを作成できます。それが完了したら、認証方法に基づいてユーザーをサインインまたはリダイレクトできます。
# users/user_controller.rb def google begin data = Google::Auth::IDTokens.verify_oidc access_token, aud: "YOUR_GOOGLE_CLIENT_ID" // find the user in the data // if the user does not exist, create a user using data // sign the user (based on your authentication method) rescue StandardError => e end end
# config/routes.rb scope :user do post 'google' => 'users#user_controller.rb' end
PS : サーバーにrack-cors
がインストールされていることを確認し、このapplication.rbを追加してください。
config.middleware.insert_before 0, Rack::Cors do allow do origins '*' resource( '*', headers: :any, expose: ['Authorization'], methods: %i[get patch put delete post options show] ) end end
このようなエラーに直面しないように
PPS : アプリケーションが Web 用の Google Sign-In JavaScript Platform Library を使用している場合、前者は非推奨になるため、必ず Google Identity Service に移行してください。
この記事が、One Tap Login をプロジェクトに統合するのに役立つことを願っています。より詳細な情報については、公式をチェックしてください。
こちらにも掲載