Пакет clientcredentials OAuth 2.0 Client Credentials Flow
Пакет реализует поток OAuth 2.0 учетные данные клиента client credentials, также известный как двухногая OAuth 2.0
Используется, когда:
- Клиент действует от своего имени
- Клиент является владельцем ресурса
- Запрашивается доступ к защищенным ресурсам на основе предварительной авторизации
Спецификация: https://tools.ietf.org/html/rfc6749#section-4.4
Тип Config
type Config struct {
// ClientID - идентификатор приложения
ClientID string
// ClientSecret - секрет приложения
ClientSecret string
// TokenURL - endpoint сервера для получения токенов
TokenURL string
// Scopes - запрашиваемые разрешения (опционально)
Scopes []string
// EndpointParams - дополнительные параметры запроса
EndpointParams url.Values
// AuthStyle - способ аутентификации клиента
AuthStyle oauth2.AuthStyle
}
Config описывает двухноговый OAuth2 поток, содержащий информацию о клиентском приложении и URL endpoint’ов сервера.
Методы Config
func (*Config) Client
func (c *Config) Client(ctx context.Context) *http.Client
Возвращает HTTP-клиент, который:
- Автоматически добавляет токены авторизации
- Обновляет токены по истечении срока
- Использует HTTP-клиент из контекста (через oauth2.HTTPClient)
Важно: возвращенный клиент и его Transport не должны изменяться.
func (*Config) Token
func (c *Config) Token(ctx context.Context) (*oauth2.Token, error)
Получает токен, используя учетные данные клиента (client credentials).
Может использовать кастомный HTTP-клиент из контекста.
func (*Config) TokenSource
func (c *Config) TokenSource(ctx context.Context) oauth2.TokenSource
Возвращает источник токенов, который:
- Возвращает текущий токен, пока он действителен
- Автоматически обновляет токен при истечении срока
- Использует client ID и client secret для обновления
Рекомендация: большинству пользователей следует использовать Config.Client вместо прямого использования TokenSource.
Особенности реализации
-
Сценарии использования:
- Сервер-серверное взаимодействие
- Микросервисная архитектура
- Фоновые процессы без участия пользователя
-
Безопасность:
- ClientSecret должен храниться защищенно
- Рекомендуется использовать HTTPS для всех запросов
-
Гибкость:
- Поддержка различных методов аутентификации (AuthStyle)
- Возможность передачи дополнительных параметров (EndpointParams)