Библиотека 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)
}
Поддержка популярных провайдеров
Библиотека включает готовые конфигурации для многих сервисов:
- Google —
google.Endpoint - GitHub —
github.Endpoint - Facebook —
Также в библиотеке
Рекомендаций