🥃
【Go】Googleの認可コードからユーザ情報などを取得する実装(2023年9月時点)
概要
Googleの認証ですが度々仕様が変わることがあり、少し久しぶりにGoで実装した際にハマってしまいました。
2023年9月時点ですが、どのような実装なら認可コードを使用して認証できるかというのをメモ書きします。
前提
- クライアントシークレットは、JSONファイルを用いて行う前提とします。JSONファイルの詳細についてはGoogleの認証ドキュメントを参照ください。
- 使用したライブラリgolang.org/x/oauth2のバージョンは
v0.11.0
になります。 - 使用したライブラリgoogle.golang.org/apiのバージョンは
v0.138.0
になります。 - 認可コードの取得についてはVue.js から Google OAuthでaccess_token,refresh_tokenを取得するの記事を、参照頂ければと思います。
実装サンプル
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