OAuth клиент для Go (Golang): Подключение к OAuth 2.0 провайдерам

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Библиотека OAuth клиента для Go (Golang)

Библиотека golang.org/x/oauth2 — это официальный пакет для работы с протоколом OAuth 2.0 на языке Go. Она предоставляет удобный интерфейс для аутентификации пользователей через сторонние сервисы (Google, GitHub, Facebook, VK и другие), а также для управления токенами доступа и обновления.

Этот инструмент является стандартом де-факто для реализации OAuth 2.0 в Go-приложениях. Он активно поддерживается командой Go и используется в тысячах проектов, включая Kubernetes, Docker и многие другие.

Основные возможности

  • Поддержка всех грантов OAuth 2.0 — Authorization Code, Client Credentials, Resource Owner Password Credentials, Implicit.
  • Автоматическое управление токенами — получение, обновление и хранение access/refresh токенов.
  • Встроенная поддержка популярных провайдеров — Google, GitHub, Facebook, Microsoft, Slack и других.
  • Гибкая настройка HTTP-клиента — автоматическая подстановка токенов в заголовки запросов.
  • Безопасное хранение токенов — поддержка шифрования и кастомных хранилищ.
  • Интеграция с net/http — простой middleware для обработки запросов.

Установка

Установка производится стандартным способом через go get:

go get golang.org/x/oauth2

Также рекомендуется установить пакет для конкретного провайдера, например для Google:

go get golang.org/x/oauth2/google

Базовый пример использования

Рассмотрим простой пример аутентификации через Google OAuth 2.0:

package main

import (
    "context"
    "fmt"
    "net/http"
    "golang.org/x/oauth2"
    "golang.org/x/oauth2/google"
)

func main() {
    // Конфигурация OAuth 2.0
    config := &oauth2.Config{
        ClientID:     "ВАШ_CLIENT_ID",
        ClientSecret: "ВАШ_CLIENT_SECRET",
        RedirectURL:  "http://localhost:8080/callback",
        Scopes:       []string{"https://www.googleapis.com/auth/userinfo.email"},
        Endpoint:     google.Endpoint,
    }

    // Создаем URL для авторизации
    authURL := config.AuthCodeURL("state-token", oauth2.AccessTypeOffline)
    fmt.Println("Перейдите по ссылке:", authURL)

    // Обработка callback
    http.HandleFunc("/callback", func(w http.ResponseWriter, r *http.Request) {
        code := r.URL.Query().Get("code")
        token, err := config.Exchange(context.Background(), code)
        if err != nil {
            http.Error(w, "Ошибка обмена кода", http.StatusInternalServerError)
            return
        }
        fmt.Fprintf(w, "Токен доступа: %s\n", token.AccessToken)
    })

    http.ListenAndServe(":8080", nil)
}

Работа с токенами

Библиотека предоставляет удобные методы для работы с токенами:

// Сохранение токена
token := &oauth2.Token{
    AccessToken:  "access-token",
    TokenType:    "Bearer",
    RefreshToken: "refresh-token",
    Expiry:       time.Now().Add(1 * time.Hour),
}

// Создание HTTP-клиента с автоматической подстановкой токена
client := config.Client(context.Background(), token)

// Выполнение запроса с авторизацией
resp, err := client.Get("https://www.googleapis.com/oauth2/v2/userinfo")
if err != nil {
    // обработка ошибки
}
defer resp.Body.Close()

Кастомное хранилище токенов

Для продакшн-приложений рекомендуется реализовать собственное хранилище:

type TokenStorage interface {
    GetToken() (*oauth2.Token, error)
    SetToken(*oauth2.Token) error
}

// Пример с использованием файла
type FileStorage struct {
    path string
}

func (f *FileStorage) GetToken() (*oauth2.Token, error) {
    data, err := os.ReadFile(f.path)
    if err != nil {
        return nil, err
    }
    token := &oauth2.Token{}
    json.Unmarshal(data, token)
    return token, nil
}

func (f *FileStorage) SetToken(token *oauth2.Token) error {
    data, _ := json.Marshal(token)
    return os.WriteFile(f.path, data, 0600)
}

Поддержка популярных провайдеров

Библиотека включает готовые конфигурации для многих сервисов:

Рекомендаций