アホほど簡単な

Google Sign-In

安全で安心で簡単に

ログインの仕組み作れないかな?

ってことでいくつか

OAuth に試した中で

アホほど簡単だった

Google Sign-In について

説明していきます

GCP にプロジェクトを作成

1

クライント ID の作成

2

OAuth の同意

認証情報の作成

クライアントでの認可

3

サインインのコードを書く

<!DOCTYPE html>
<html lang="en">
<head>
  <title>Google Sign-in</title>
  
  <!-- 1. ライブラリを読み込む -->
  <script src="https://apis.google.com/js/platform.js" async defer></script>
  
  <!-- 2. クライント ID を指定する -->
  <meta name="google-signin-client_id" content="{CLIENT_ID}">
  
</head>
<body>

  <!-- 3. ボタンを設置する -->
  <div class="g-signin2" data-onsuccess="onSignIn"></div>
  
  <!-- 4. サインインしてプロフィール情報を取得する -->
  <script>
    function onSignIn(googleUser) {
      const profile = googleUser.getBasicProfile()
      console.log(profile)
    }
  </script>
  
</body>
</html>

サインアウトのコードを書く

<body>

  <!-- 1. ボタンを設置する -->
  <button type="button" onclick="signOut()">Sign out</button>
  
  <!-- 2. サインアウトする -->
  <script>
    function signOut() {
      const auth2 = gapi.auth2.getAuthInstance()
      auth2.signOut().then(() => {
        console.log('サインアウトしました')
      })
    }
  </script>
  
</body>

バックエンドサーバーでの認可

5

トークンを

バックエンドサーバに送る

<body>
  <script>
    function onSignIn(googleUser) {

      // 1. トークンを取得する
      const { id_token } = googleUser.getAuthResponse()

      // 2. トークンを POST する
      fetch('http://localhost:8081/', {
        method: 'POST',
        mode: 'no-cors',
        headers: {
          'Content-Type': 'application/x-www-form-urlencoded'
        },
        body: `idToken=${id_token}`
      })

    }
  </script>
</body>

トークンが有効であるか確認

const express = require('express')
const bodyParser = require('body-parser')
const { OAuth2Client } = require('google-auth-library')

const CLIENT_ID = '{CLIENT_ID}'

const app = express()
const client = new OAuth2Client(CLIENT_ID)

app.use(bodyParser.urlencoded({ extended: true }))
app.post('/', async (req, res) => {
  const { idToken } = req.body

  const ticket = await client.verifyIdToken({
    idToken,
    audience: CLIENT_ID,
  })
  const payload = ticket.getPayload()
  const userid = payload['sub']
  const email = payload['email']
  console.log(userid, email)

  res.send('OK')
})
app.listen(8081, 'localhost')
// 1. ライブラリを読み込む
const { OAuth2Client } = require('google-auth-library')

// 2. インスタンスを生成
const client = new OAuth2Client(CLIENT_ID)

app.post('/', async (req, res) => {
  // 3. トークンを取得
  const { idToken } = req.body

  // 4. トークンを検証する
  const ticket = await client.verifyIdToken({
    idToken,
    audience: CLIENT_ID,
  })

  // 5. 検証結果からユーザ情報を取得する
  const payload = ticket.getPayload()
  const userid = payload['sub']
  const email = payload['email']
  console.log(userid, email)
})

重要な部分だけ抜き出してみる

セッション管理も出来ているので

あとはお好きなようにどうぞ

DEMO のリポジトリ

Google 以外の

OAuth も使いたいのであれば

Firebase Authentication

手軽にやりたいのであれば

Firebase UI

サービスが

ユーザのログイン情報を扱うより

ユーザにとっても

開発者にとっても

安全で安心で簡単

認可してもらいましょう

END

アホほど簡単な Google Sign-In

By Syuji Higa

アホほど簡単な Google Sign-In

  • 225