🥃

【Go】Googleの認可コードからユーザ情報などを取得する実装(2023年9月時点)

2023/09/04に公開

概要

Googleの認証ですが度々仕様が変わることがあり、少し久しぶりにGoで実装した際にハマってしまいました。
2023年9月時点ですが、どのような実装なら認可コードを使用して認証できるかというのをメモ書きします。

前提

実装サンプル

import (
	"context"
	"os"

	"golang.org/x/oauth2/google"
	v2 "google.golang.org/api/oauth2/v2"
	"google.golang.org/api/option"
)

func GetGoogleUserProfileFromAuthCodeSample(authCode string) (*v2.Tokeninfo, error) {
	cxt := context.Background()
	// 事前にダウンロードしたjson
	credentialFilePath := "../googleCredential/" + os.Getenv("GOOGLE_CREDENTIAL_FILE")
	b, err := os.ReadFile(credentialFilePath)
	if err != nil {
		return nil, err
	}

	config, err := google.ConfigFromJSON(b, "email profile openid")
	if err != nil {
		return nil, err
	}
	config.RedirectURL = os.Getenv("VIEW_DOMAIN") // 認証コードの取得元をRedirectURLに設定
	token, err := config.Exchange(cxt, authCode)
	if err != nil {
		return nil, err
	}

	service, err := v2.NewService(cxt, option.WithTokenSource(config.TokenSource(cxt, token)))
	if err != nil {
		return nil, err
	}

	userInfo, err := service.Tokeninfo().AccessToken(token.AccessToken).Context(cxt).Do()
	if err != nil {
		return nil, err
	}

	return userInfo, nil
}

Discussion