package usecase import ( "crypto/rand" "encoding/base64" "errors" "io" ) const opaqueTokenBytes = 32 type CryptoTokenGenerator struct{} func (CryptoTokenGenerator) NewToken() (string, error) { value := make([]byte, opaqueTokenBytes) if _, err := io.ReadFull(rand.Reader, value); err != nil { return "", errors.New("generate opaque token") } return base64.RawURLEncoding.EncodeToString(value), nil }