Google Calender API Logo

【ユーザー情報取得編】トークンからGoogleアカウントの名前やメールアドレスを取得する方法

2024/11/17

背景

【トークン取得編】ユーザの Google カレンダー情報を取得できる、よく見る同意画面を実装する方法

の続きの記事です。
上記でGoogleアカウントに紐づく情報を操作できるトークンを取得しました。

取得したトークンだけでは、どの Google アカウントと紐付いているかを判断できません。
複数のアカウントを管理するためにも、Google アカウントの名前やメールアドレスを取得する必要があります。

Togello Google Account Management

実装

Google 認証サービスから callback で呼ばれる API で token だけでなく、Google アカウントの情報も取得し保存する形に実装を修正する。

import (
	googleOAuth2 "google.golang.org/api/oauth2/v1"
)

func V2GoogleOAuthCallbackGetController(ctx *gin.Context) {
  config := &oauth2.Config{
    ClientID:     "12345-hogefuga.apps.googleusercontent.com",
    ClientSecret: "HOGE-FUGA",
    Endpoint:     google.Endpoint,
    Scopes: []string{
      // 以前の記事では記載してなかったので注意。追加対応してください。
      "https://www.googleapis.com/auth/userinfo.profile",
      "https://www.googleapis.com/auth/userinfo.email",
      "https://www.googleapis.com/auth/calendar.calendars.readonly",
      "https://www.googleapis.com/auth/calendar.calendarlist.readonly",
    },
    RedirectURL: "http://localhost:8000/v2/auth/google-oauth/callback",
  }

  // トークンの有効期限をいい感じに調整してくれるTokenSourceと共にServiceを生成
  tokenSource := config.TokenSource(ctx, token)
  googleOAuth2Service, _ := googleOAuth2.NewService(ctx, option.WithTokenSource(tokenSource))

  // ユーザー情報取得用のサービスを生成とユーザー情報の取得
  userInfoService, _ := googleOAuth2.NewUserinfoV2Service(googleOAuth2Service), nil
  info, _ := userInfoService.Me.Get().Do()

  // トークンとGoogleアカウントを組み合わせて保存する
  save(token, info)
}

最後に

今回の実装により、Google アカウントの名前やメールアドレスを取得し、連携中のアカウント情報を明確に管理できるようになりました。
また、callback 時の state をリッチにすれば、Google アカウントでログインする機能なども提供可能になります。

次はついに Google カレンダーの情報を取得する記事を書きたいと思います。

Twitterフォロー待ってます!