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 メソッドを使うと取り出せるという話だった
おわり