Autenticación
Autenticar medios y transmisiones
Cómo autenticar instantáneas, fotogramas exactos, descargas de clips, transmisiones HLS, DASH y WebSocket en vivo y grabadas, enlaces de transmisión compartida y transmisiones LAN de Rhombus, desde servidores, apps nativas y navegadores.
En esta página
Esta página se tradujo automáticamente. Si encuentras errores o tienes sugerencias, escríbenos.
Los medios (instantáneas, fotogramas, clips, video en vivo y grabado, audio) provienen de los hosts de medios, no de la API REST, y las URL que devuelve la API no llevan ninguna credencial. Tú agregas una a cada solicitud. Tres reglas cubren casi todo:
- Desde tu servidor o una app nativa, envía tu clave de API como encabezados (
x-auth-scheme: api-tokenyx-auth-apikey), o un access token de OAuth comoAuthorization: Bearer <token>. - Desde un navegador (un
<img>, un<video>, un reproductor de JavaScript o un WebSocket), envía un token federado como parámetros de consulta:?x-auth-scheme=federated-token&x-auth-ft=<token>. Las claves de API y los access tokens de OAuth no se pueden enviar en una URL. - Las cámaras de tu red local aceptan solo tokens federados. Es una decisión deliberada: en la red local, cada solicitud lleva un token de corta duración que puedes limitar a una cámara. Consulta Streaming por LAN.
Dos WebSockets distintos. El video y el audio en vivo se transmiten por URL de WebSocket por cámara que devuelve getMediaUris; siguen las reglas de esta página. El WebSocket de eventos en ws.rhombussystems.com entrega alertas y cambios de dispositivos; consulta Autenticación de WebSocket.
Hosts
| Qué | Host de EE. UU. | Notas |
|---|---|---|
| Instantáneas, fotogramas, descargas de clips | media.rhombussystems.com | UE: media.eu.rhombussystems.com |
| Transmisiones en vivo y grabadas | Hosts por cámara como <id>.dash.rhombussystems.com, que devuelve getMediaUris | Algunas solicitudes a media.rhombussystems.com redirigen (307) al host de la cámara; sigue las redirecciones |
| Cámaras en tu LAN | <camera>.lan.rhombussystems.com:8000 | DNS público para una dirección privada; usa el nombre de host, no la IP |
Las credenciales están vinculadas a una región: una clave o un token de EE. UU. no funciona en hosts de la UE.
Instantáneas y fotogramas exactos
La instantánea más reciente de una cámara:
https://media.rhombussystems.com/media/{cameraUuid}/{mediaRegion}/snapshot.jpegcameraUuid y mediaRegion provienen de getMinimalCameraStateList.
curl "https://media.rhombussystems.com/media/CAMERA_UUID/MEDIA_REGION/snapshot.jpeg" \
-H "x-auth-scheme: api-token" \
-H "x-auth-apikey: $RHOMBUS_API_KEY" \
-o snapshot.jpegcurl "https://media.rhombussystems.com/media/CAMERA_UUID/MEDIA_REGION/snapshot.jpeg" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-o snapshot.jpeg<img src="https://media.rhombussystems.com/media/CAMERA_UUID/MEDIA_REGION/snapshot.jpeg?x-auth-scheme=federated-token&x-auth-ft=TOKEN" />Para un fotograma en un momento específico, llama a getExactFrameUri (marcas de tiempo en milisegundos). La URI que devuelve no está firmada: solicítala con los mismos encabezados o, en un navegador, agrégale los mismos parámetros de consulta.
Descargas de clips guardados
Los clips guardados (de spliceV3 o de la consola) se descargan del host de medios según la región y el UUID del clip. Toma la región del clipLocation del clip:
curl "https://media.rhombussystems.com/media/metadata/{clipLocation.region}/{clipUuid}.mp4" \
-H "x-auth-scheme: api-token" \
-H "x-auth-apikey: $RHOMBUS_API_KEY" \
-o clip.mp4Para reproducirlo en línea, usa en su lugar /media/play/{region}/{clipUuid}.mp4 (admite solicitudes Range). El rol de la credencial necesita permiso para ver video guardado. Un token federado limitado a un dispositivo puede obtener un clip guardado solo cuando todas las cámaras del clip son el dispositivo del token.
Video en vivo y grabado
POST /api/camera/getMediaUris devuelve las URL de transmisión de una cámara:
| Campo | Formato | Úsalo con |
|---|---|---|
wanLiveM3u8Uri | HLS | <video> de Safari, hls.js, AVPlayer, ExoPlayer, ffmpeg |
wanLiveMpdUri | DASH | dash.js |
wanLiveH264Uri | H.264 por WebSocket (la latencia más baja) | Un decodificador propio, o el React SDK |
wanVodM3u8UriTemplate, wanVodMpdUriTemplate | HLS / DASH grabado | Reemplaza {START_TIME} (tiempo Unix, en segundos) y {DURATION} (en segundos) |
Campos lan… | Los mismos formatos en tu LAN | Consulta Streaming por LAN |
Llama a getMediaUris con la credencial que usará tu reproductor y luego autentica cada formato como se indica a continuación.
HLS
Agrega el token a la URL de la playlist. En los hosts de la nube, la playlist lleva los parámetros de consulta del token a cada URL de segmento, así que los reproductores no necesitan nada más:
const url = `${wanLiveM3u8Uri}?x-auth-scheme=federated-token&x-auth-ft=${token}`;
if (video.canPlayType("application/vnd.apple.mpegurl")) {
video.src = url; // Safari
} else {
const hls = new Hls();
hls.loadSource(url);
hls.attachMedia(video);
}Desde una app nativa o un servidor, envía en su lugar los encabezados de la clave de API o Authorization: Bearer en cada solicitud.
DASH
Agrega el token a la URL del manifiesto. En los hosts de la nube, los manifiestos DASH en vivo y grabados (y los manifiestos de clips de alertas) llevan los parámetros de consulta del token a cada URL de segmento, así que una sola URL funciona en cualquier reproductor:
const url = `${wanLiveMpdUri}?x-auth-scheme=federated-token&x-auth-ft=${encodeURIComponent(token)}`;
const player = dashjs.MediaPlayer().create();
player.initialize(video, url, true);Solo los parámetros de consulta de tokens federados y de enlaces compartidos se llevan a los segmentos. Las claves de API y x-auth-org nunca se copian en las URL de segmento, así que un cliente de servidor o nativo envía sus encabezados en cada solicitud.
Para las transmisiones desde una cámara de tu LAN, agrega tú mismo el token a cada solicitud. Con dash.js 5, un interceptor de solicitudes lo hace, y no modifica ninguna URL que ya lleve el token:
const auth = `x-auth-scheme=federated-token&x-auth-ft=${encodeURIComponent(token)}`;
const withAuth = (url) => (url.includes("x-auth-ft=") ? url : `${url}${url.includes("?") ? "&" : "?"}${auth}`);
const player = dashjs.MediaPlayer().create();
player.addRequestInterceptor((request) => {
request.url = withAuth(request.url);
return Promise.resolve(request);
});
player.initialize(video, lanLiveMpdUris[0], true);WebSocket (H.264 y audio)
En un navegador, pon el token en la URL; desde un servidor o una app nativa, también funcionan los encabezados, igual que un access token de OAuth en Authorization: Bearer:
const ws = new WebSocket(`${wanLiveH264Uri}?x-auth-scheme=federated-token&x-auth-ft=${token}`);
ws.binaryType = "arraybuffer";Un token generado con domain funciona aquí: los navegadores envían Origin en el handshake del WebSocket. Consulta El campo domain.
Los sockets de medios abiertos (video en vivo, audio bidireccional, robot y PTZ) se cierran con el código 1008 en un máximo de 60 segundos cuando se revoca su credencial o cambia su acceso. Con un token de OAuth, el audio bidireccional se verifica en cada mensaje, y enviar audio sin el scope physical cierra el socket con 1008 (Scopes de OAuth).
El socket en vivo del robot acepta claves de API, access tokens de OAuth y tokens federados de la misma forma.
Claves de partner
Un partner que llama desde un servidor a los medios de una organización cliente envía su credencial de partner como encabezados (x-auth-scheme: api-token con x-auth-apikey, o Authorization: Bearer con un token de OAuth de partner) más x-auth-org: <client org UUID>. x-auth-org es solo un encabezado y nunca se copia en las URL de segmento. Para un navegador, genera un token federado para la organización cliente (envía x-auth-org al generarlo).
Enlaces de transmisión compartida
createSharedLiveVideoStream crea un enlace al video en vivo de una cámara que funciona sin ninguna credencial de Rhombus:
sharedLiveVideoStreamUrlabre una página de reproductor de Rhombus; insértala en un<iframe>.sharedLiveM3U8StreamUrles una playlist HLS sin procesar para tu propio reproductor.
Cualquiera que tenga el enlace puede ver la transmisión, así que trátalo como una contraseña:
expirationTimeSecses el tiempo Unix (en segundos) en que el enlace deja de funcionar, no una duración. Si lo omites, el enlace nunca vence.- Enlaces protegidos con contraseña (
createProtectedSharedLiveVideoStream): la página del reproductor pide la contraseña; para la URL HLS sin procesar, envíaAuthorization: Basic <base64(":" + password)>(con un nombre de usuario vacío). Una contraseña faltante o incorrecta devuelve 401 conWWW-Authenticate: Basic. - Elimina el enlace compartido (
deleteSharedLiveVideoStream) para detenerlo de inmediato.
Solución de problemas
| Síntoma | Causa probable | Solución |
|---|---|---|
403 DOMAIN_NOT_ALLOWED en una URL de medios | El token se generó con un domain que no es el origen exacto de la página (esquema, host, puerto), o la solicitud no lleva Origin ni Referer (un servidor, un reproductor nativo, una página con Referrer-Policy: ) | Genera el token con el origen exacto de tu página, o sin domain para clientes fuera de un navegador |
| 401 en una URL de medios | La credencial falta, está dañada, venció o fue revocada; errorCode indica cuál | Envía la credencial en cada solicitud o genera un token nuevo (Cómo interpretar los errores de autenticación) |
| Un manifiesto DASH de la LAN carga, pero los segmentos fallan | Las solicitudes de segmentos no llevan token | Agrégalo a cada solicitud (consulta DASH) |
| Funciona en hosts de EE. UU. y falla en hosts de la UE | Las claves y los tokens están vinculados a una región | Genera el token en la misma región que la cámara |
Un token limitado a un dispositivo falla en api2 | Los tokens con deviceUUid solo funcionan para medios | Usa un token no limitado a un dispositivo para las llamadas REST |
| 403 con un token limitado a un dispositivo en un clip o un enlace compartido | El clip incluye otras cámaras, o la URL no nombra ningún dispositivo | Genera un token no limitado a un dispositivo para esas solicitudes |
| 403 en una descarga de clip | El rol no puede ver video guardado, o la región de la URL es incorrecta | Revisa el rol y clipLocation |
Un WebSocket de medios se cierra con el código 1008 | Se revocó la credencial o cambió su acceso, o un token de OAuth sin physical envió audio bidireccional | Vuelve a conectarte con una credencial válida, o pide el scope physical |
| Un enlace compartido dejó de funcionar | expirationTimeSecs era una duración (un tiempo Unix ya pasado) | Envía un tiempo Unix en segundos |