AlexxIT/go2rtc · error

session validation failed

Error message

session validation failed: %w

What it means

RingApi.Request wraps any error from ensureSession() with 'session validation failed'. The library maintains a Ring session (auth token) and validates/refreshes it before every API call; if that validation or refresh fails, the request is aborted before being sent. This means the Ring credentials or session state are unusable.

Solutions

  1. Verify Ring credentials (email/password or refresh token) supplied to the client are correct and current
  2. Re-authenticate from scratch: clear cached session/token state and log in again to obtain a fresh session
  3. Check network connectivity to Ring's auth/API endpoints (proxy, firewall, DNS)
  4. If 2FA is enabled on the account, supply the required verification code/token as the library expects
  5. Check that the system clock is accurate (large skew breaks token validity)

Example fix

// before
ticket, err := c.ensureSession()
if err != nil {
    return nil, fmt.Errorf("session validation failed: %w", err) // opaque to caller
}
// after
ticket, err := c.ensureSession()
if err != nil {
    if errors.Is(err, ErrInvalidCredentials) {
        return nil, fmt.Errorf("ring login rejected credentials, re-authenticate: %w", err)
    }
    return nil, fmt.Errorf("session validation failed: %w", err)
}
Defensive patterns

Strategy: try-catch

Validate before calling

// Go: check session state before calling
if err := api.Ping(ctx); err != nil {
    // force re-login before real calls
    if reauthErr := api.Reauthenticate(); reauthErr != nil {
        return fmt.Errorf("cannot establish ring session: %w", reauthErr)
    }
}

Try / catch

// Go
resp, err := api.Request("GET", url, nil)
if err != nil {
    if strings.Contains(err.Error(), "session validation failed") {
        // re-authenticate then retry once
        if rErr := api.Reauthenticate(); rErr == nil {
            resp, err = api.Request("GET", url, nil)
        }
    }
    if err != nil {
        return err
    }
}

Prevention

When it happens

Trigger: Calling RingApi.Request (any method/URL) when ensureSession() fails: no session exists and initial login fails, the stored session/token is expired and refresh fails, or invalid credentials were supplied to the client.

Common situations: Wrong or revoked Ring username/password or refresh token; Ring changed its auth API; network outage or firewall blocking Ring auth endpoints; 2FA/verification code required but not provided; system clock skew invalidating tokens.

Related errors


AI-assisted analysis of AlexxIT/go2rtc@c245815e75 (2026-09-07). Data as JSON: /api/errors/cd8bc28c6a41f996. Report an issue: GitHub.

Appendix: source

Thrown at pkg/ring/api.go:406

func (c *RingApi) GetSocketTicket() (*SocketTicketResponse, error) {
	response, err := c.Request("POST", AppAPI("clap/ticket/request/signalsocket"), nil)
	if err != nil {
		return nil, fmt.Errorf("failed to fetch socket ticket: %w", err)
	}

	var ticket SocketTicketResponse
	if err := json.Unmarshal(response, &ticket); err != nil {
		return nil, fmt.Errorf("failed to unmarshal socket ticket response: %w", err)
	}

	return &ticket, nil
}

func (c *RingApi) Request(method, url string, body interface{}) ([]byte, error) {
	// Ensure we have a valid session
	if err := c.ensureSession(); err != nil {
		return nil, fmt.Errorf("session validation failed: %w", err)
	}

	var bodyReader io.Reader
	if body != nil {
		jsonBody, err := json.Marshal(body)
		if err != nil {
			return nil, fmt.Errorf("failed to marshal request body: %w", err)
		}
		bodyReader = bytes.NewReader(jsonBody)
	}

	// Create request
	req, err := http.NewRequest(method, url, bodyReader)
	if err != nil {
		return nil, fmt.Errorf("failed to create request: %w", err)
	}

	// Set headers

View on GitHub (pinned to c245815e75)