[Javascript] Googleログイン

GoogleCloudにアクセス

1. サイトにアクセス(Googleログイン済みの状態)

GoogleCloud 利用規約などにチェックをして、同意して次に進む。

2. プロジェクトの選択をクリック

3. 新しいプロジェクトをクリック

4. プロジェクト名を入力

登録完了すると、下記のような表示になります。

5. OAuth同意情報をクリック

公開型のWEBページで使うので、「外部」を選択して、「作成」ボタンをクリック。 アプリ名とサポートメールを入力 ディベロッパーのメールアドレスを入力(上記と同じものを入力しました。) 他のところは未記入で、保存して完了しましょう。

6. 認証情報をクリック

7. 認証情報を作成 - OAuthクライアントIDをクリック

8. アプリケーションの種類で「ウェブアプリケーション」を選択

9. 認証済みのJavascript生成元を登録

公開するURLと、開発環境のURLを登録しておきます。 開発環境が、"http://localhost:8888"のようにポート番号がある場合は、下記のように2種類の登録をしないと正常にアクセスできません。 http://localhost http://localhost:8888 登録が完了したら、「作成」ボタンを押す。

10. 登録完了画面で、JSONデータをダウンロードしておく

"google_oauth.json"というファイル名で保存しておきました。

WEBページのJavascriptの記述方法

クライアントIDが書かれたJSONファイルが取得できたら、それを読み込んで、OAuth認証できるように、ホームページの設定を行います。 汎用的に対応できるように、処理をライブラリ化して、htmlで読み込んで使えるようにしておきました。

index.html

<script src='google_oauth.js'></script> <div id='google_oauth'></div> <div id='user'></div>

google_oauth.js

(()=>{ function Main(){ this.load_json() } Main.prototype.load_json = function(){ const xhr = new XMLHttpRequest() xhr.open('get' , 'google_oauth.json' , true) xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.onload = this.loaded_json.bind(this) xhr.send() } Main.prototype.loaded_json = function(e){ this.json_data = JSON.parse(e.target.response) this.load_module() } Main.prototype.load_module = function(){ const script = document.createElement('script') script.src = 'https://accounts.google.com/gsi/client' script.onload = (()=>{ this.init_module() this.view_login_button() }).bind(this) document.querySelector('head').appendChild(script) } Main.prototype.init_module = function(){ google.accounts.id.initialize({ prompt_parent_id : 'google_oauth', client_id : this.json_data.web.client_id, prompt_close_button : false, callback : this.login_callback.bind(this), }) } Main.prototype.view_login_button = function(){ google.accounts.id.renderButton(document.getElementById('google_oauth') , { logo_alignment : 'center', size : 'medium', type : 'icon', }) } Main.prototype.login_callback = function(e){ const data = this.jwt_decode(e.credential) this.logined_icon_view(data) } Main.prototype.logined_icon_view = function(data){ if(!data || !data.picture){return} const elm = document.getElementById('user') if(!elm){return} const img = new Image() img.src = data.picture elm.innerHTML = '' elm.appendChild(img) } Main.prototype.jwt_decode = function(jwt){ const base64Url = jwt.split('.')[1] const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/') const str1 = atob(base64) const str2 = escape(str1) const str3 = decodeURIComponent(str2) return JSON.parse(str3) } switch(document.readyState){ case 'complete': case 'interactive': new Main() break default: window.addEventListener('DOMContentLoaded' , (()=>{new Main()})) } })()

Howto

1. index.htmlをブラウザで開くと、Googleのログインアイコンが表示されるので、クリックして、Googleでログインをする。 2. ログイン後に、ページに戻ってきて、ログインで取得した、画像が表示されます。
ログインデータは、名前、メールアドレス、などが取得できるので、cookieやLocalStorageなどに格納して、ログイン状態を保持することで、 簡易にログインシステムを構築することが可能です。

注意点

GoogleCloudの無料枠が、1月に100ユーザーまでの利用になっています。 それ以上のユーザーになる場合は、有料課金するか、別のログイン方式にしてください。

エラー対応

うまく、ログインボタンが表示されなくて、ブラウザコンソールに、次のようなエラーが出る場合。 Failed to load resource: the server responded with a status of 403 () m=credential_button_library:44 [GSI_LOGGER]: The given origin is not allowed for the given client ID. こんな場合は、GoogleCloudの設定に問題がある場合がほとんどです。 そして、ほとんどが、「認証済みのJavascript生成元の登録」のURL登録が正常にできていない事が原因です。