GoogleのOpenID Connectを使ってみる ID Token取得編 on golang

Google で OAuth2 で Access Token / Refresh Token の取得はできたけど、ID Token を取得するにはどうしたらいいんだろう となったのでメモ

今回はgolang.org/x/oauth2を主に使います

けつろん

  • code を Exchange したあとの token で Extra メソッドを使うと任意の key が取り出せるのでそれをつかうと良い

Config まわり

  • Scope に openid を入れる必要がある
  • oauth2/google の Endpoint が古そうだったので新しいものを使ってみる

    googleConfig := &oauth2.Config{
            ClientID:     conf.Client.Google.ID,
            ClientSecret: conf.Client.Google.Secret,
            RedirectURL:  conf.Client.Google.RedirectURL,
            Scopes: []string{
                "openid",
                "profile",
                "email",
                // お好みでscopeを加える
            },
            Endpoint: oauth2.Endpoint{
                AuthURL:       "https://accounts.google.com/o/oauth2/v2/auth",
                TokenURL:      "https://oauth2.googleapis.com/token",
                DeviceAuthURL: "https://oauth2.googleapis.com/device/code",
                AuthStyle:     oauth2.AuthStyleInParams,
            },
        }
    ...

Callback したあと

  • Callback 後は query param に code などがついてくるのでoauth2.Configの Exchange メソッドで oauth2.Token に交換する。
  • が、oauth2.Tokenには id_token に対応するフィールドが存在しない。なので以下のように実装するとid_tokenがとれる

	token, err := oauthConf.Exchange(ctx, code)
	if err != nil {
		return err
	}

	idToken, ok := token.Extra("id_token").(string)
	if !ok {
		// error handling...
	}
    ...
  • じつは private field になっている token.raw にレスポンスが詰まっているので Extra メソッドを使うと取り出せるという話だった

おわり