Работа с oauth2 в golang

За работу с методом авторизации oauth2 в golang отвечает пакет golang.org/x/oauth2.

Создание объекта Config

Прежде всего нам необходимо создать объект конфигурации Oauth:

&oauth2.Config{
			ClientID:     "46197",
			ClientSecret: "4759912abdd765ac1bba5f7d8ded0c112b3ee1ec",
			RedirectURL:  "http://localhost:8000/callback",
			Endpoint:     endpoints.Strava,
			Scopes: []string{
				"activity:read_all",
			},
		}

В пакете golang.org/x/oauth2/endpoints можно найти эндопойнты для популярных сервисов.

Получение URL для авторизации

У этого объекта можно запросить сформированный URL по которому пользователь должен пройти чтобы выдать права на API:

oauthConf.AuthCodeURL("state")

Обработка callback’а

В handler’е который будет обрабатывать http://localhost:8000/callback необходимо обменять код авторизации на токен:

func CallbackHandler(c *oauth2.Config) http.HandlerFunc {
	return func(rw http.ResponseWriter, r *http.Request) {
		token, _ := c.Exchange(r.Context(), r.URL.Query().Get("code"))
		fmt.Println(token.AccessToken)
		fmt.Println(token.RefreshToken)

Получение HTTP клиента

Полученный токен можно передать в метод Client исходного объекта

HTTPClient = c.Client(r.Context(), token)

так как объект токен содержит в себе и refresh token то его обновление пройдет автоматически. Этот клиент будет автоматически подставлять нужные headers в заголовки запросов.

Получение HTTP клиента из сохраненного токена

var t oauth2.Token
json.Unmarshal(store["s"], &t)
 
client := oauth2.NewClient(context.Background(), oauth2.StaticTokenSource(&t))