package oauth import ( "bytes" "crypto/rand" "encoding/base64" "encoding/json" "errors" "fmt" "io" "strings" ) func randomToken(size int) (string, error) { buf := make([]byte, size) if _, err := rand.Read(buf); err != nil { return "", err } return base64.RawURLEncoding.EncodeToString(buf), nil } func encodeSegment(value any) (string, error) { raw, err := json.Marshal(value) if err != nil { return "", err } return base64.RawURLEncoding.EncodeToString(raw), nil } func decodeSegment(segment string, value any) error { raw, err := base64.RawURLEncoding.DecodeString(segment) if err != nil { return err } decoder := json.NewDecoder(bytes.NewReader(raw)) decoder.UseNumber() if err := decoder.Decode(value); err != nil { return err } if _, err := decoder.Token(); !errors.Is(err, io.EOF) { return fmt.Errorf("oauth: trailing JSON data") } return nil } func splitJWT(token string) (string, string, string, bool) { parts := strings.Split(token, ".") if len(parts) != 3 { return "", "", "", false } return parts[0], parts[1], parts[2], true }