Go言語には golang.org/x 配下で提供されている準標準ライブラリがある。

この中に golang.org/x/oauth2 があって、OAuth2クライアント周りの実装が置かれている。

準、とはいえ、OAuth2の実装が標準として提供されているのはGoの良さだよね。

最近、その中の golang.org/x/oauth2/clientcredentials に気づいた。

OAuth2.0 Client Credentials Grants typeのクライアント周りのあれこれをやってくれて、めちゃ便利。

config := clientcredentials.Config{
    ClientID:     "my-client-id",
    ClientSecret: "my-client-secret",
    TokenURL:     "https://auth.example.com/oauth2/token",
}

client := config.Client(ctx)

resp, err := client.Get("https://api.example.com/resources")

golang.org/x/oauth2/clientcredentials パッケージ以外も見てみたら、

などなどのOAuthプロバイダごとのpackageがあって、それぞれエンドポイントのURLをoauth2.Endpoint で定数定義してあるだけ。
(var定義なので、やろうと思えば書き換えられるので定数ですらないんだけど...)

と思ったら、golang.org/x/oauth2/endpoints ってのもあって、そこにはサービスごとのoauth2.Endpoint定数が鬼のように並んでいた...

oauth2/endpoints/endpoints.go at master · golang/oauth2

いくらbatteries includedっていっても限度があるやろ... 今は新規にOAuth2プロバイダごとのpackageは作らずにこのoauth2/endpoints packageに追記していく方針らしいけど...

どんな基準で追加されてるんだろう...みたいなのを眺めてたら、golang.org/x/oauth2/cern を見つけた。 そう、あのCERN(欧州原子核研究機構)。

CERNの研究論文とか?オープンデータとか?にアクセスできるAPIがpublicに提供されているみたい。知らなかった。 まぁ知っていたとして使う機会はなかったと思うけども。

どういう経緯でこのようにOAuth2プロバイダ固有のエンドポイントが定数として提供されているかわからないけど、こういう発見がたまにあるから、golang.org/x packageは面白い。