package services import ( "crypto/rand" "encoding/hex" "fmt" ) // size in bytes of the client ids and secrets const IDSecretSize = 32 func GenerateRandomHex(size int) (string, error) { raw := make([]byte, size) n, err := rand.Read(raw) if err != nil { return "", fmt.Errorf("failed to read from random generator: %w", err) } if n != size { return "", fmt.Errorf("failed to read from random generator (%d/%d)", n, size) } return hex.EncodeToString(raw), nil } func GenerateClientIDSecret() (string, string, error) { clientID, err := GenerateRandomHex(IDSecretSize) if err != nil { return "", "", fmt.Errorf("failed to generate client id: %w", err) } clientSecret, err := GenerateRandomHex(IDSecretSize) if err != nil { return "", "", fmt.Errorf("failed to generate client secret: %w", err) } return clientID, clientSecret, nil }