Documentación
Cómo empezar

OAuth 2.0

Una guía completa para implementar Inicio de Sesión y Registro usando el flujo de Código de Autorización OAuth 2.0 de Deriv con PKCE.

Cómo funciona el flujo

1
Generar PKCE
2
Redirigir a Deriv
3
Usuario se autentica
4
Código de Cambio
5
Usar token
  1. Genere PKCE — Cree un code_verifier (cadena aleatoria) y derive code_challenge = BASE64URL(SHA256(code_verifier)). También genere un state aleatorio para protección CSRF.
  2. Redirigir a Deriv — Envíe al usuario a la URL de autorización de Deriv con todos los parámetros requeridos.
  3. El usuario se autentica — Deriv muestra el formulario de inicio de sesión o registro. Todas las pantallas de inicio de sesión y consentimiento son administradas por el proveedor de OAuth.
  4. Redirigir de vuelta — Deriv redirige al usuario a su redirect_uri con un código de autorización y state.
  5. Verifique el estado — Confirme que el state devuelto coincide con lo que almacenó. Esto previene ataques CSRF.
  6. Intercambiar código por token — Su backend envía el código + code_verifier al endpoint de token de Deriv y recibe un access_token.
  7. Use el token — Realice llamadas API autenticadas usando el token Bearer.

Antes de comenzar

Necesita:

  • Un cliente OAuth2 registrado de Deriv con un client_id y un redirect_uri pre-registrado.
  • HTTPS habilitado en su URL de redireccionamiento. Para el desarrollo local, puede utilizar http://localhost.
  • Su aplicación debe manejar redirecciones, leer el código de autorización e intercambiarlo por tokens.

Paso 1: Generar parámetros PKCE

Generando PKCE en JavaScript

// 1. Generate a random code_verifier
const array = crypto.getRandomValues(new Uint8Array(64));
const codeVerifier = Array.from(array)
  .map(v => 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~'[v % 66])
  .join('');

// 2. Derive the code_challenge
const hash = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(codeVerifier));
const codeChallenge = btoa(String.fromCharCode(...new Uint8Array(hash)))
  .replace(/\+/g, '-')
  .replace(/\//g, '_')
  .replace(/=+$/, '');

// 3. Generate a random state for CSRF protection
const state = crypto.getRandomValues(new Uint8Array(16))
  .reduce((s, b) => s + b.toString(16).padStart(2, '0'), '');

// 4. Store code_verifier and state before redirecting
sessionStorage.setItem('pkce_code_verifier', codeVerifier);
sessionStorage.setItem('oauth_state', state);

Parámetros de solicitud de autorización obligatorios:

  • response_type=code
  • client_id
  • redirect_uri
  • scope
  • state
  • code_challenge + code_challenge_method=S256 (PKCE)

Paso 2: Redirija al usuario al endpoint de autorización

Envíe a los usuarios al endpoint de autorización OAuth 2.0 de Deriv:

https://auth.deriv.com/oauth2/auth

Iniciar sesión

El inicio de sesión usa los parámetros estándar OAuth2 + PKCE sin adiciones.

Parámetros

ParámetroValorDescripción
response_typeObligatorio
codeSolicite un código de autorización
client_idObligatorio
Your app IDID de aplicación OAuth2 registrado desde Deriv
redirect_uriObligatorio
Your callback URLDebe coincidir exactamente con el URI registrado en Deriv
scopeObligatorio
tradeaccount_manageapplication_readpayment
Lista separada por espacios de los permisos que solicita su aplicación — consulte la tabla de alcances de OAuth a continuación
stateObligatorio
Random stringProtección contra CSRF: genere un nuevo valor para cada solicitud
code_challengeObligatorio
BASE64URL(SHA256(verifier))El desafío PKCE derivado de code_verifier
code_challenge_methodObligatorio
S256Siempre SHA-256

Alcances de OAuth

El parámetro de alcance es una lista separada por espacios de los permisos que solicita su aplicación. Solicite únicamente los alcances que su aplicación necesita.

AlcanceDescripción
tradeAcceso a operaciones de trading.
account_manageAcceso de escritura para la creación y gestión de cuentas.
application_readAcceso de solo lectura a sus aplicaciones registradas.
paymentAcceso a operaciones de depósito y retiro de agentes de pago.

Los scopes que seleccione para su aplicación en Aplicaciones registradas son el máximo que puede solicitar. No se otorgan automáticamente cada vez que un usuario inicia sesión.

Cada solicitud de autorización puede pedir algunos o todos esos scopes. La pantalla de consentimiento muestra al usuario solo los scopes de esa solicitud, y el token de acceso que recibe está limitado a ellos.

Si una solicitud incluye un scope que no está seleccionado para su aplicación, la autorización falla con un error invalid_scope.

URL de inicio de sesión

https://auth.deriv.com/oauth2/auth?
  response_type=code
  &client_id={YOUR_CLIENT_ID}          # e.g. app12345
  &redirect_uri={YOUR_REDIRECT_URI}    # e.g. https://yourapp.com/callback
  &scope=trade+account_manage
  &state={RANDOM_STATE}                # e.g. abc123random
  &code_challenge={PKCE_CHALLENGE}     # e.g. E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM
  &code_challenge_method=S256

Crear cuenta

El registro usa la misma URL base y parámetros que el inicio de sesión, más un parámetro obligatorio adicional:

Parámetro de registro requerido

ParámetroValorDescripción
promptObligatorio
registrationSiempre este valor exacto. Le dice a Deriv que muestre el formulario de registro en lugar del inicio de sesión.

Parámetros opcionales de atribución de socios

Los siguientes parámetros son todos opcionales y se gestionan en el panel de Socios. Inclúyalos para atribuir registros a su cuenta de socio. El parámetro de token de seguimiento tiene cuatro nombres equivalentes (t, affiliate_token, sidi, ca) — use el que aparezca en su enlace de referido o en el panel de Socios.

ParámetroValorPropósito
taffiliate_tokensidica
Su token de seguimiento de afiliadosSeguimiento y atribución. Use solo uno de estos nombres de parámetros — son alias equivalentes. Elija el que aparece en su enlace de referido o en el panel de Socios.
utm_campaignEl nombre de su campañaIdentifica la campaña de marketing
utm_mediumaffiliateIndica una integración de socios
utm_sourceSu ID de afiliadoSeguimiento e informes de comisiones

URL de Crear Cuenta

https://auth.deriv.com/oauth2/auth?
  response_type=code
  &client_id={YOUR_CLIENT_ID}          # e.g. app12345
  &redirect_uri={YOUR_REDIRECT_URI}    # e.g. https://yourapp.com/callback
  &scope=trade+account_manage
  &state={RANDOM_STATE}                # e.g. abc123random
  &code_challenge={PKCE_CHALLENGE}     # e.g. E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM
  &code_challenge_method=S256
  &prompt=registration
  &t={YOUR_TRACKING_TOKEN}             # or: affiliate_token | sidi | ca — use the name from your referral link
  &utm_campaign={YOUR_CAMPAIGN}        # e.g. dynamicworks
  &utm_medium=affiliate
  &utm_source={YOUR_AFFILIATE_ID}      # e.g. CU303219

Paso 3: Maneje el callback

Ya sea que el usuario haya iniciado sesión o se haya registrado, el callback funciona exactamente de la misma manera. Después de la autenticación, Deriv redirige a su redirect_uri:

https://yourapp.com/callback?code=AUTHORIZATION_CODE&state=RANDOM_STATE

Si algo salió mal:

https://yourapp.com/callback?error=access_denied&error_description=User+cancelled

Su aplicación debe:

  1. Verifique el estado — compare el state de la URL con el valor que almacenó antes de la redirección. Si no coinciden, aborte — puede ser un ataque CSRF.
  2. Extraiga el código — lea el parámetro de consulta code.

Paso 4: Intercambiar código por tokens

Realice una solicitud POST desde su backend al endpoint de token. Nunca realice el intercambio de token desde el navegador.

POST https://auth.deriv.com/oauth2/token

Cuerpo de solicitud (codificado en formulario)

grant_type=authorization_code
client_id=YOUR_CLIENT_ID
code=AUTH_CODE_FROM_CALLBACK
code_verifier=YOUR_ORIGINAL_CODE_VERIFIER
redirect_uri=https://your-app.com/callback

ejemplo cURL

curl -X POST https://auth.deriv.com/oauth2/token \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=authorization_code" \
  -d "client_id=YOUR_CLIENT_ID" \
  -d "code=AUTH_CODE" \
  -d "code_verifier=YOUR_CODE_VERIFIER" \
  -d "redirect_uri=https://your-app.com/callback"

Respuesta de token

{
  "access_token": "ory_at_...",
  "expires_in": 2592000,
  "token_type": "Bearer"
}

expires_in es la duración del token en segundos. La respuesta no incluye un token de actualización; consulte Duración y renovación del token.

Paso 5: Use el token de acceso en llamadas API

Incluya el token de acceso como un token Bearer en el encabezado Authorization para todas las llamadas API:

Authorization: Bearer YOUR_ACCESS_TOKEN

Ejemplo

curl -X GET "https://api.derivws.com/trading/v1/options/accounts" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Duración y renovación del token

Todos los tokens de acceso vencen. Lea su duración en segundos desde expires_in en la respuesta del token y, luego, almacene la hora de vencimiento (la hora en que recibió el token más expires_in) junto con el token. No codifique una duración fija, ya que puede cambiar.

Para obtener un nuevo token de acceso, envíe al usuario nuevamente a través del flujo de autorización (Authorization Code + PKCE) desde el paso 1 cuando:

  • El número de segundos indicado en expires_in ha transcurrido
  • Una llamada a la API devuelve 401

Si un nuevo token de acceso también recibe un 401, no inicie el flujo de nuevo. En su lugar, revise el Authorization encabezado y el endpoint.

Referencia rápida

EndpointURL
Autorizaciónhttps://auth.deriv.com/oauth2/auth
Intercambio de tokenhttps://auth.deriv.com/oauth2/token
URL base de APIhttps://api.derivws.com

Dónde encontrar sus valores:

ValorDónde
client_idRegistre una aplicación OAuth2 con Deriv — recibirá un ID de aplicación
redirect_uriSe establece durante el registro de la aplicación; debe coincidir exactamente
t / affiliate_token / sidi / ca (signup)Su enlace de referencia o el panel de Socios: use el nombre exacto del parámetro que se muestra allí
utm_source / affiliate ID (signup)Gestionado y configurado en el panel de Socios
utm_campaign (signup)Gestionado y configurado en el panel de Socios

Solución de problemas

ProblemaCausa probableCorrección
Error de discrepancia de estadoEl parámetro state en el callback no coincide con el valor almacenadoAlmacene state en sessionStorage antes de redirigir y no lo regenere al cargar la página
invalid_grant en el intercambio de tokenscode_verifier no coincide con el desafío, o el código venció o ya se utilizóEnvíe el code_verifier original, no uno generado recientemente; intercambie el código de inmediato
La URI de redireccionamiento no coincideLa URL no coincide exactamente con la registradaVerifique las barras diagonales finales, http frente a https y los números de puerto
invalid_clientclient_id incorrectoVerifique sus credenciales desde el Deriv dashboard
Se muestra el formulario de inicio de sesión en lugar del registroFalta prompt=registrationAgregue prompt=registration a la URL de autorización
Registro no atribuido al socioParámetros UTM faltantes o incorrectosVerifique que el parámetro de su token de seguimiento (uno de t, affiliate_token, sidi o ca) coincida con el que se muestra en su enlace de referencia y que utm_source, utm_medium y utm_campaign estén presentes y sean correctos
401 en llamadas que antes funcionabanEl token de acceso vencióEjecute nuevamente el flujo de autorización desde el paso 1 para obtener un nuevo token de acceso; no hay token de actualización
invalid_scope en la autorizaciónLa solicitud incluye un scope que no está seleccionado para su aplicaciónSolicite solo los scopes seleccionados para su aplicación o agregue primero el scope a su aplicación en Aplicaciones registradas
403 Insufficient scopes en una llamada a la APIAl token de acceso no se le otorgó el scope que necesita este endpointAgregue el scope a su solicitud de autorización y ejecute el flujo nuevamente para obtener un nuevo token de acceso

Lista de verificación de implementación

Iniciar sesión

  • response_type es code
  • client_id y redirect_uri están registrados con Deriv
  • code_challenge y state se generan nuevos para cada solicitud
  • code_verifier se almacena en sessionStorage antes de redirigir
  • El callback verifica state antes de intercambiar el código
  • El intercambio de token ocurre del lado del servidor (no en el navegador)
  • code_verifier se borra del almacenamiento después del uso
  • El flujo de autorización se ejecuta de nuevo cuando el token vence o una llamada devuelve 401, pero no cuando un nuevo token de acceso también recibe un 401

Registro (adicional)

  • prompt está establecido en registration (obligatorio)
  • Token de seguimiento (uno de t, affiliate_token, sidi, ca) utm_source, utm_campaign y utm_medium se establecen si es necesario; use el nombre del parámetro que se muestra en su enlace de referencia o en el panel de Partners (opcional)
Click to open live chat support. Get instant help from our support team.