Пакет jwt (JSON Web Token)
Пакет jwt реализует поток OAuth 2.0 с использованием JSON Web Token, известный как “двухногая OAuth 2.0” (two-legged OAuth 2.0).
Спецификация: https://tools.ietf.org/html/draft-ietf-oauth-jwt-bearer-12
Типы
type Config
type Config struct {
// Email - идентификатор OAuth-клиента
Email string
// PrivateKey содержит содержимое RSA-ключа или PEM-файла
PrivateKey []byte
// PrivateKeyID - необязательный идентификатор ключа
PrivateKeyID string
// Subject - необязательный пользователь для имперсонации
Subject string
// Scopes - запрашиваемые области доступа
Scopes []string
// TokenURL - endpoint для JWT-потока
TokenURL string
// Expires - срок действия токена
Expires time.Duration
// Audience - целевая аудитория запроса
Audience string
// PrivateClaims - кастомные JWT-claims
PrivateClaims map[string]any
// UseIDToken - использовать ID-токен вместо access-токена
UseIDToken bool
}
Config содержит конфигурацию для получения токенов через JWT (“двухногая OAuth 2.0”).
Пример
package main
import (
"context"
"golang.org/x/oauth2/jwt"
)
func main() {
ctx := context.Background()
conf := &jwt.Config{
Email: "xxx@developer.com",
// The contents of your RSA private key or your PEM file
// that contains a private key.
// If you have a p12 file instead, you
// can use `openssl` to export the private key into a pem file.
//
// $ openssl pkcs12 -in key.p12 -out key.pem -nodes
//
// It only supports PEM containers with no passphrase.
PrivateKey: []byte("-----BEGIN RSA PRIVATE KEY-----..."),
Subject: "user@example.com",
TokenURL: "https://provider.com/o/oauth2/token",
}
// Initiate an http.Client, the following GET request will be
// authorized and authenticated on the behalf of user@example.com.
client := conf.Client(ctx)
client.Get("...")
}
Методы Config
func (*Config) Client
func (c *Config) Client(ctx context.Context) *http.Client
Client возвращает HTTP-клиент, который автоматически добавляет Authorization-заголовки с токенами, полученными из конфигурации.
Возвращенный клиент и его Transport не должны изменяться.
func (*Config) TokenSource
func (c *Config) TokenSource(ctx context.Context) oauth2.TokenSource
TokenSource возвращает источник токенов JWT, используя конфигурацию и HTTP-клиент из переданного контекста.
Особенности реализации
-
Формат ключей:
- Поддерживаются RSA-ключи и PEM-файлы без пароля
- Для конвертации PKCS#12 в PEM используйте:
openssl pkcs12 -in key.p12 -out key.pem -nodes
-
Кастомные claims:
- Можно добавлять собственные claims через PrivateClaims
- Спецификация: https://tools.ietf.org/html/draft-jones-json-web-token-10#section-4.3
-
Аудитория:
- Если Audience не указан, используется TokenURL
-
Тип токена:
- При UseIDToken=true будет использоваться ID-токен вместо access-токена