Skip to content
Authentication

Authentication

Setiap request transaksi membawa header Authorization: Bearer <token>. TokenManager mengambil, dan untuk B2B meng-cache, token tersebut — request akses token selalu ditandatangani secara asymmetric terlepas dari mode signing transaksi Anda (lihat Signing).

TokenManager

type TokenManager struct {
	BaseURL    string
	ClientKey  string
	Signer     crypto.Signer
	HTTPClient *http.Client
	Profile    Profile
	Now        func() time.Time // opsional; nil berarti time.Now
}

HTTPClient default ke klien internal dengan timeout wajar bila dibiarkan nil. Profile default ke DefaultProfile{}. Now hanya dipakai untuk testing.

B2B: client_credentials

func (m *TokenManager) AccessTokenB2B(ctx context.Context) (string, error)

Mengembalikan access token client_credentials yang di-cache, mengambil (dan meng-cache) yang baru bila belum ada cache atau cache yang ada sudah mencapai atau melewati waktu kedaluwarsanya.

tm := &snap.TokenManager{
	BaseURL:   "https://partner.example.com",
	ClientKey: clientKey,
	Signer:    rsaPrivateKey,
}
token, err := tm.AccessTokenB2B(ctx)

Bila beberapa goroutine memanggil ini bersamaan saat token sudah kedaluwarsa, hanya satu request HTTP yang dikirim — yang lain menunggu dan berbagi hasilnya. Request itu berjalan di context-nya sendiri, jadi bila satu pemanggil membatalkan, itu tidak merusak hasil untuk yang lain yang sedang menunggu.

Caching memakai expiresIn yang dilaporkan server dikurangi sedikit margin keamanan (mengambil ulang sedikit sebelum benar-benar kedaluwarsa), dengan batas bawah setengah dari expiresIn supaya nilai yang tidak biasa kecilnya tidak membuat margin menghabiskan seluruh jendela cache.

B2B2C: authorization code / refresh token

func (m *TokenManager) AccessTokenB2B2C(ctx context.Context, grantType GrantType, code string) (Token, error)

Token B2B2C tidak di-cache — setiap pemanggilan adalah pertukaran baru, karena grant-nya terikat ke satu customer/code tertentu, bukan ke integrasi secara keseluruhan.

type GrantType string

const (
	GrantTypeClientCredentials GrantType = "client_credentials"
	GrantTypeAuthorizationCode GrantType = "AUTHORIZATION_CODE"
	GrantTypeRefreshToken      GrantType = "REFRESH_TOKEN"
)
Penulisan huruf di atas adalah format wire standar itu sendiri, bukan typo — client_credentials huruf kecil-snake, sedangkan grant B2B2C huruf besar-snake. Nilainya dikirim persis seperti dideklarasikan.
type Token struct {
	AccessToken  string
	TokenType    string
	ExpiresIn    time.Duration
	RefreshToken string // diisi hanya untuk B2B2C
}

Isi code dengan authorization code OAuth (untuk GrantTypeAuthorizationCode, biasanya didapat dari alur yang dimulai registration.GetOAuthURL) atau refresh token yang sudah diterbitkan sebelumnya (untuk GrantTypeRefreshToken).

Selanjutnya