Пакет 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-клиент из переданного контекста.

Особенности реализации

  1. Формат ключей:

    • Поддерживаются RSA-ключи и PEM-файлы без пароля
    • Для конвертации PKCS#12 в PEM используйте:
      openssl pkcs12 -in key.p12 -out key.pem -nodes
      
  2. Кастомные claims:

  3. Аудитория:

    • Если Audience не указан, используется TokenURL
  4. Тип токена:

    • При UseIDToken=true будет использоваться ID-токен вместо access-токена