【トークン取得編】ユーザの Google カレンダー情報を取得できる、よく見る同意画面を実装する方法
【ユーザー情報取得編】トークンから Google アカウントの名前やメールアドレスを取得する方法
の続きの記事です。
上記で Google カレンダーの情報を取得するトークの取得と Google アカウントが管理できる状態になりました。
今回の記事では、Google カレンダーからユーザーの予定情報を取得し、それを一覧形式で表示する実装方法を解説します。
Google カレンダー取得用のの API を新規で作成します。
以前の記事で DB など永続化層に保存したトークン情報を取得し、Google API にリクエストを送ることでカレンダー情報を取得できます。
import (
"togello/internal/google_oauth"
"google.golang.org/api/calendar/v3"
"google.golang.org/api/option"
)
func V2GoogleCalendarEventGetController(ctx *gin.Context) (any, error) {
// トークンを永続化層(DBなど)から取得
token := &oauth2.Token{
AccessToken: "DBから取得想定",
RefreshToken: "DBから取得想定",
TokenType: "DBから取得想定",
Expiry: "DBから取得想定",
}
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",
// 以前の記事では記載してなかったので注意。追加対応してください。
"https://www.googleapis.com/auth/calendar.events.readonly",
},
RedirectURL: "http://localhost:8000/v2/auth/google-oauth/callback",
}
// RefreshTokenからいい感じに有効なTokenを取得してくれるものを使用
tokenSource := config.TokenSource(ctx, token)
// カレンダーのイベントを取得するサービスを生成
calendarService, _ := calendar.NewService(ctx, option.WithTokenSource(tokenSource))
calendarEventService := calendar.NewEventsService(calendarService)
// カレンダーID("primary"はデフォルトのカレンダーを取得するらしい)
calendarID := "primary"
events, _ := calendarEventService.List(calendarID).
ShowDeleted(false).
SingleEvents(true).
TimeMin(time.Now().Format(time.RFC3339)).
TimeMax(time.Now().AddDate(0, 0, 7).Format(time.RFC3339)). // 現在時刻から1週間後までの予定の取得を固定でやっているのリクエストの内容で指定するなど変更すると良い
OrderBy("startTime").
Do()
c.JSON(http.StatusOK, events)
}
今回の実装により、ユーザーが Google アカウント連携したカレンダー情報を取得できるようになりました。
この状態では、Google Cloud でテストユーザーとして登録されたアカウントのみが連携可能です。
本番環境で全てのユーザーに公開するには、Google の承認プロセスを通過する必要があります。
次回は、この承認プロセスで必要な準備と手順について解説します。
Twitterフォロー待ってます!