Autenticación
Una característica distintiva principal de las cuentas de usuario es que se obtienen los tokens de autenticación iniciando sesión mediante una clásica combinación de correo electrónico y contraseña. Sin embargo, el flujo completo de inicio de sesión y registro es bastante complejo e involucra varios pasos.
Se debe tener especial cuidado al manejar las credenciales de los usuarios e implementar el flujo de inicio de sesión y registro de Discord. Discord no tolera el spam en sus endpoints de autenticación, y una implementación incorrecta o solicitudes sospechosas pueden llevar a la terminación de cuentas.
Huellas digitales
Discord utiliza huellas digitales (fingerprints) para persistir experimentos durante todo el flujo de autenticación. Para más información sobre fingerprints, consulta la documentación de experimentos correspondiente.
Si el cliente no está autenticado, se debe generar un fingerprint usando Get Experiment Assignments e incluirse en la cabecera X-Fingerprint
así como en cualquier parámetro JSON fingerprint
aplicable hasta que se complete la autenticación.
Sesiones
Discord utiliza sesiones para rastrear el estado de autenticación del usuario. Una sesión se crea cuando el usuario inicia sesión y se invalida cuando cierra sesión o la sesión expira. Las sesiones son únicas para un solo token de autenticación y llevan un registro de la última ubicación desde la que se usaron. Las sesiones sospechosas pueden ser marcadas por Discord y llevar a que la cuenta sea bloqueada, requiriendo que el usuario restablezca su contraseña.
El ID de sesión de autenticación correspondiente a la sesión de Gateway actual se entrega en el campo auth_session_id_hash
en el evento Ready. Si alguna vez la sesión de autenticación del Gateway actual cambia (por ejemplo, debido a un restablecimiento de contraseña), el cliente recibirá un evento Auth Session Change Gateway.
Objeto de sesión de autenticación
Estructura de sesión de autenticación
id_hash
string
El hash del ID de sesión.
approx_last_used_time
ISO8601 timestamp
Cuándo se usó por última vez la sesión.
client_info
auth session client info object
El cliente asociado por última vez con la sesión.
Estructura de información de cliente de sesión de autenticación
os
?string
El sistema operativo del cliente.
platform
?string
El nombre del cliente o plataforma del navegador.
location
?string
La ubicación aproximada del cliente.
Ejemplo de sesión de autenticación
{
"id_hash": "y3vq9yYww3Y1yAhc4ChuRtCOHADRu0gTPoIU5y3DcS4=",
"approx_last_used_time": "2024-03-30T21:30:58.100231+00:00",
"client_info": {
"os": "Windows",
"platform": "Discord Client",
"location": "San Francisco, California, United States"
}
}
Endpoints
Obtener sesiones de autenticación
GET /auth/sessions
Devuelve hasta 50 de las sesiones de autenticación activas del usuario.
Cuerpo de respuesta
user_sessions
array[auth session object]
Sesiones de autenticación activas para el usuario.
Cerrar sesión de autenticación
POST /auth/sessions/logout
MFA Requerido
Invalida una lista de sesiones de autenticación. Devuelve una respuesta vacía 204 en caso de éxito.
Parámetros JSON
session_id_hashes
array[string]
Los hashes de ID de sesión a invalidar (1-64).
Inicio de sesión
El proceso de inicio de sesión es el primer paso para autenticar a un usuario.
Para iniciar sesión, un cliente debe primero usar el endpoint Login Account con el correo electrónico/número de teléfono del usuario y contraseña. Si el usuario tiene habilitada la autenticación de múltiples factores, el cliente debe usar el endpoint Verify MFA Login para completar el proceso después de una respuesta exitosa.
Si se devuelve un código de error JSON conocido, el cliente debe manejar el error en consecuencia (por ejemplo, solicitar al usuario que recupere su cuenta o verifique su número de teléfono). Si se devuelve un error de formulario, el cliente debe mostrar el mensaje de error al usuario.
Una vez que el usuario haya iniciado sesión, el cliente debe guardar el token de autenticación para evitar tener que iniciar sesión nuevamente en el futuro.
Inicio de sesión sin contraseña
Una alternativa al flujo tradicional de inicio de sesión por correo/contraseña es el flujo Conditional UI de WebAuthn. Esto permite a los usuarios iniciar sesión usando un dispositivo WebAuthn (por ejemplo, un llavero de seguridad) en vez de una contraseña.
Para usar este flujo, el cliente debe primero generar un desafío usando el endpoint Start Passwordless Login. Tras completar el usuario el desafío de WebAuthn, el cliente debe usar el endpoint Finish Passwordless Login para completar el proceso. Usando este flujo, igual se debe manejar cualquier error según lo descrito anteriormente.
Transferencia de autenticación
El proceso de transferencia se usa para transferir de forma segura el estado de autenticación de un usuario entre dos clientes, comúnmente usado para autenticar el sitio web de Discord desde un cliente nativo y viceversa.
Para transferir autenticación a otro cliente, el cliente origen debe generar un token de transferencia (handoff) mediante el endpoint Create Handoff Token. El token se pasa al cliente destino, que puede usar el endpoint Exchange Handoff Token para obtener un nuevo token de autenticación.
Los tokens de transferencia son de un solo uso y solo son válidos para la dirección IP desde la que se generaron.
Endpoints
Iniciar sesión en la cuenta
POST /auth/login
No autenticado
Recupera un token de autenticación para las credenciales dadas.
Cuando se inicia sesión por primera vez en una cuenta (sin MFA habilitada) desde una nueva ubicación, Discord puede rechazar la solicitud de inicio de sesión y requerir que el usuario verifique el intento mediante correo electrónico o número de teléfono.
Si se inicia sesión mediante correo electrónico, el usuario recibirá un enlace que redirige al cliente oficial de Discord con un token de verificación presente en el fragmento de la URL (ej. https://discord.com/authorize-ip#token=Wzg1Mjg5MjI5NzY2MTkwNjk5MywiMTI3LjAuMC4x8J+RvSJd.kdI8zppMIeTZsIBva3zZslaz_58
).
Si se inicia sesión mediante número de teléfono, la solicitud fallará con un código de error JSON 70007
, y el usuario recibirá un código de verificación por SMS. Se debe obtener un token de verificación verificando el número de teléfono.
Después de autorizar la IP con este token de verificación, se debe reintentar la solicitud de inicio de sesión. No debería requerirse un nuevo desafío CAPTCHA.
Si la cuenta del usuario está suspendida por Discord, la solicitud de inicio de sesión fallará con un error 403 Forbidden y un cuerpo de respuesta de error especial, similar a una respuesta exitosa:
{
"user_id": "852892297661906993",
"suspended_user_token": "ODUyODkyMjk3NjYxOTA2OTkz.Hcj0Nl.YEJSsjeq_vJKLpOofd5QMksqw32e"
}
Los tokens de autenticación suspendidos no pueden utilizarse como tokens de autenticación normales. Solo pueden usarse para ver el estado de la cuenta y apelar la suspensión de la cuenta.
Parámetros JSON
1 Si obtienes un código de error JSON de cuenta deshabilitada (20013
) o marcada para eliminación (20011
), puedes recuperar la cuenta configurando este parámetro.
login
string
El correo electrónico del usuario o número de teléfono en formato E.164.
password
string
La contraseña del usuario (8-72 caracteres).
undelete?
boolean
Si se debe recuperar una cuenta auto-deshabilitada o auto-eliminada (por defecto falso).
login_source?
?string
El origen de la solicitud de inicio de sesión.
gift_code_sku_id?
?string
El SKU ID del código de regalo que inició la solicitud.
Origen de inicio de sesión
Desde dónde se inicia el inicio de sesión fuera del flujo normal:
gift
Solicitud iniciada por un código de regalo.
guild_template
Solicitud iniciada por una plantilla de servidor.
guild_invite
Solicitud iniciada por una invitación a servidor.
dm_invite
Solicitud iniciada por una invitación a MD grupal.
friend_invite
Solicitud iniciada por una invitación de amigo.
role_subscription
Solicitud iniciada por una redirección de suscripción de rol.
role_subscription_setting
Solicitud iniciada desde la configuración de suscripción de rol.
Cuerpo de respuesta
user_id
snowflake
El ID del usuario autenticado.
token?
string
El token de autenticación, si el inicio de sesión fue completado.
user_settings?
login settings object
Preferencias parciales del usuario, si el login fue completado.
required_actions?
array[string]
Acciones requeridas antes de continuar usando Discord.
ticket?
string
Ticket utilizado en el flujo de autenticación de múltiples factores.
mfa?
boolean
Si es necesario MFA para iniciar sesión (por defecto falso).
totp?
boolean
Si el usuario tiene habilitado MFA basado en TOTP.
sms?
boolean
Si el usuario tiene habilitado MFA basado en SMS.
backup?
boolean
Si se pueden usar códigos de respaldo para el MFA.
webauthn?
?string
Cadena JSON de challenge de WebAuthn.
Estructura de preferencias de inicio de sesión
locale
string
Opción de idioma elegida por el usuario.
theme
string
Tema del cliente seleccionado por el usuario (dark
o light
).
Tipo de acción obligatoria de inicio de sesión
update_password
El usuario debe cambiar su contraseña para cumplir los nuevos requisitos de Discord.
Ejemplo de respuesta (completado)
{
"user_id": "852892297661906993",
"token": "ODUyODkyMjk3NjYxOTA2OTkz.GX5Xdp.22jsdSqEiHLUYEJSsjeq_vJKLpOofd5QMksqw32e",
"user_settings": {
"locale": "en-US",
"theme": "dark"
},
"required_actions": ["update_password"]
}
Ejemplo de respuesta (requiere MFA)
{
"user_id": "852892297661906993",
"mfa": true,
"sms": true,
"ticket": "ODUyODkyMjk3NjYxOTA2OTkz.H2Rpq0.WrhGhYEhM3lHUPN61xF6JcQKwVutk8fBvcoHjo",
"backup": true,
"totp": true,
"webauthn": "{\"publicKey\":{\"challenge\":\"a8a1cHP7_zYheggFG68zKUkl8DwnEqfKvPE-GOMvhss\",\"timeout\":60000,\"rpId\":\"discord.com\",\"allowCredentials\":[{\"type\":\"public-key\",\"id\":\"izrvF80ogrfg9dC3RmWWwW1VxBVBG0TzJVXKOJl__6FvMa555dH4Trt2Ub8AdHxNLkQsc0unAGcn4-hrJHDKSO\"}],\"userVerification\":\"preferred\"}}"
}
Verificar inicio de sesión con MFA
POST /auth/mfa/{authenticator_type}
Verifica un inicio de sesión de múltiples factores y recupera un token de autenticación usando el tipo de autenticador especificado.
Si la cuenta del usuario está suspendida por Discord, la solicitud de inicio de sesión fallará con un error 403 Forbidden y un cuerpo de respuesta de error especial, similar a una respuesta exitosa:
{ "suspended_user_token": "ODUyODkyMjk3NjYxOTA2OTkz.Hcj0Nl.YEJSsjeq_vJKLpOofd5QMksqw32e" }
Los tokens de autenticación suspendidos no pueden utilizarse como tokens de autenticación normales. Solo pueden usarse para ver el estado de la cuenta y apelar la suspensión de la cuenta.
Parámetros JSON
ticket
string
El ticket de MFA recibido de la solicitud de inicio de sesión.
code
string
El código MFA (TOTP, SMS, backup, o WebAuthn) a verificar.
login_source?
?string
El origen de la solicitud de inicio de sesión.
gift_code_sku_id?
?string
El ID de SKU del código de regalo.
1 Para WebAuthn, el parámetro code
debe ser un objeto JSON stringificado de la respuesta de credencial de clave pública.
Cuerpo de respuesta
token
string
El token de autenticación.
user_settings
login settings object
Las preferencias parciales del usuario.
Ejemplo respuesta (completado):
{
"token": "ODUyODkyMjk3NjYxOTA2OTkz.GX5Xdp.22jsdSqEiHLUYEJSsjeq_vJKLpOofd5QMksqw32e",
"user_settings": {
"locale": "en-US",
"theme": "dark"
}
}
Inicio de sesión sin contraseña
POST /auth/conditional/start
No autenticado
Genera un challenge para iniciar el flujo Conditional UI de WebAuthn.
Cuerpo de respuesta
ticket
string
Ticket para el login WebAuthn.
challenge
string
Challenge stringificado JSON para opciones de request de credencial de clave pública WebAuthn.
Ejemplo de respuesta
{
"challenge": "{\"publicKey\":{\"challenge\":\"sLPruFUWBzowZjYy5d2caF2067pw44butrN0iHm_8k4\",\"timeout\":60000,\"rpId\":\"discord.com\",\"allowCredentials\":[],\"userVerification\":\"required\",\"extensions\":{\"uvm\":true}},\"mediation\":\"conditional\"}",
"ticket": "b9f98b82-c3a7-49b6-b881-f83418fa2dbe"
}
Finalizar inicio de sesión sin contraseña
POST /auth/conditional/finish
No autenticado
Recupera un token de autenticación para las credenciales de WebAuthn proporcionadas.
Parámetros JSON
ticket
string
Ticket de login WebAuthn recibido previamente.
credential
string
Respuesta de credencial de clave pública WebAuthn como JSON stringificado.
login_source?
?string
El origen de la solicitud.
gift_code_sku_id?
?string
El SKU ID del código de regalo.
Cuerpo de respuesta
user_id
snowflake
El ID del usuario que inició sesión.
token
string
El token de autenticación.
user_settings
login settings object
Preferencias parciales del usuario.
required_actions?
array[string]
Acciones adicionales requeridas antes de continuar usando Discord.
Ejemplo de respuesta
{
"user_id": "852892297661906993",
"token": "ODUyODkyMjk3NjYxOTA2OTkz.GX5Xdp.22jsdSqEiHLUYEJSsjeq_vJKLpOofd5QMksqw32e",
"user_settings": {
"locale": "en-US",
"theme": "dark"
},
"required_actions": ["update_password"]
}
Autorizar dirección IP
POST /auth/authorize-ip
No autenticado
Autoriza la dirección IP del cliente para el inicio de sesión. Retorna una respuesta vacía 204 en caso de éxito.
Parámetros JSON
token
string
Token de verificación recibido del proceso de verificación de email o teléfono.
Crear token de transferencia
POST /auth/handoff
No autenticado
Crea un token de transferencia para pasar el estado de autenticación del usuario a otro cliente.
Parámetros JSON
key
string
Una clave única para identificar la solicitud de transferencia (por ejemplo, un UUID aleatorio).
Cuerpo de respuesta
handoff_token
string
El token de transferencia para pasar al destinatario; esto no es un token de autenticación.
Canjear token de transferencia
POST /auth/handoff/exchange
No autenticado
Canjea un token de transferencia por un token de autenticación. Los tokens de transferencia solo pueden ser canjeados una vez y solo son válidos desde la misma IP en la que fueron creados.
Parámetros JSON
key
string
La clave única usada para crear el token de transferencia.
handoff_token
string
El token de transferencia recibido del endpoint Crear token de transferencia.
Cuerpo de respuesta
token
string
El token de autenticación.
user
objeto parcial usuario
El usuario que fue autenticado.
Registro
Los usuarios potenciales deben registrar una cuenta antes de poder usar la mayoría de la plataforma.
El proceso completo incluye elegir un nombre de usuario, nombre para mostrar, correo o teléfono, contraseña y fecha de nacimiento. El cliente puede omitir algunos pasos para experiencias más rápidas (por ejemplo, al ver una invitación).
Para registrarse, primero el cliente debe recuperar la metadata de localización del usuario para determinar si se requiere consentimiento explícito. Luego, puede usar el endpoint Register Account. Durante el proceso, puede usar Get Unique Username Suggestions para sugerencias y Get Unique Username Eligibility para validarlas.
Una vez registrado, el cliente debe guardar el token de autenticación para evitar tener que iniciar sesión nuevamente después.
Registro por teléfono
Como alternativa, el cliente puede registrar una cuenta con un número de teléfono. Para hacerlo, primero debe usar Register Account with Phone Number, luego verificar el número con el código recibido y completar el registro usando Register Account normalmente.
Endpoints de registro
Registrar cuenta
POST /auth/register
Crea una nueva cuenta y recupera un token de autenticación para las credenciales proporcionadas.
Parámetros JSON
1 Uno de username
o global_name
debe ser provisto. Un nombre válido se puede obtener con el endpoint Get Unique Username Suggestions y validar con Get Unique Username Eligibility. Mira la sección de nombres de usuario y apodos para más detalles de restricciones.
2 Este valor debe estar configurado igual que el fingerprint usado durante el flujo de autenticación. Con un registro válido, la nueva cuenta compartirá el mismo ID que el fingerprint para asegurar continuidad de experimentos.
3 Si la invitación es válida, se acepta automáticamente al registrar.
4 Se puede saber si se requiere consentimiento explícito usando el endpoint Get Location Metadata.
username?
string
El nombre de usuario a registrar (por defecto aleatorio).
global_name?
?string
El nombre para mostrar a registrar.
email?
string
El correo electrónico del usuario.
phone_token?
string
El token de verificación telefónica recibido del flujo de registro por teléfono.
password?
string
Contraseña del usuario (8-72 caracteres).
date_of_birth?
ISO8601 date
Fecha de nacimiento del usuario.
fingerprint?
string
Fingerprint a usar para el registro.
invite?
?string
Código de invitación que inició el registro.
guild_template_code?
?string
Código de plantilla de servidor que inició el registro.
gift_code_sku_id?
?string
El SKU ID del código de regalo que inició el registro.
consent?
boolean
Si el usuario acepta los Términos de Servicio y Política de Privacidad de Discord.
promotional_email_opt_in?
boolean
Si el usuario acepta o no recibir correos promocionales de Discord.
Cuerpo de respuesta
token
string
El token de autenticación.
show_verification_form?
boolean
Si el usuario debe ver el formulario de verificación de miembros del servidor al que se unió.
Ejemplo de respuesta
{
"token": "ODUyODkyMjk3NjYxOTA2OTkz.GX5Xdp.22jsdSqEiHLUYEJSsjeq_vJKLpOofd5QMksqw32e",
"show_verification_form": true
}
Registrar con número de teléfono
POST /auth/register/phone
Envía un código de verificación al número de teléfono del usuario para registrar una cuenta. Retorna vacía 204 si es exitoso. Primero debe usarse el código para verificar el teléfono antes del registro final.
Parámetros JSON
phone
string
Teléfono del usuario en formato E.164.
Obtener metadata de localización
GET /auth/location-metadata
No autenticado
Retorna la metadata de localización para la IP del usuario.
Cuerpo de respuesta
country_code
string
Código de país ISO 3166-1 alpha-2 de la IP.
consent_required
boolean
Si el usuario debe aceptar expresamente Términos y Privacidad para registrarse.
promotional_email_opt_in
promotional email metadata object
Metadata de consentimiento para promocionales.
Estructura de metadatos promocionales
required
boolean
Si el usuario debe aceptar expresamente recibir correos promocionales.
pre_checked
boolean
Si la casilla debe venir seleccionada por defecto en caso de requerir consentimiento.
Ejemplo de respuesta
{
"consent_required": false,
"country_code": "CA",
"promotional_email_opt_in": {
"required": true,
"pre_checked": false
}
}
Validar fortaleza de contraseña
POST /auth/password/validate
No autenticado
Valida la seguridad de una contraseña y retorna un puntaje basado en su complejidad. Se usa para asegurar que la contraseña cumpla los requisitos de seguridad de Discord.
Parámetros JSON
password
string
Contraseña a validar (8-72 caracteres).
Cuerpo de respuesta
valid
boolean
Si la contraseña es válida según Discord.
password_strength
integer
Puntaje de robustez (0-4).
Sugerencias de nombre de usuario único
GET /unique-username/username-suggestions-unauthed
No autenticado
Retorna una sugerencia de nombre de usuario único para registro.
Parámetros query string
global_name?
string
Nombre base para las sugerencias (por defecto aleatorio).
Cuerpo de respuesta
username
string
Sugerencia de nombre de usuario.
Ejemplo de respuesta
{ "username": "gnarp.gnap" }
Comprobar disponibilidad de nombre de usuario
POST /unique-username/username-attempt-unauthed
No autenticado
Comprobar si un nombre está disponible para registrar.
Parámetros JSON
username
string
Nombre de usuario a verificar.
Cuerpo de respuesta
taken
?boolean
Si el nombre está ocupado.
Ejemplo
{ "taken": true }
Cerrar sesión
Para cerrar sesión, el cliente debe usar el endpoint de Logout con el token de autenticación del usuario. Esto se utiliza para invalidar el token y evitar que se envíen más notificaciones push al cliente. Consulta la sección de notificaciones push para más información.
Endpoints
POST /auth/logout
Invalida la sesión y desregistra el token de notificaciones push dado.
Parámetros JSON
1 Los tokens de notificaciones push específicos de VOIP solo se utilizan con PushKit en iOS.
provider?
string
Proveedor de push a revocar.
token?
string
Token a desregistrar.
voip_provider?
string
Proveedor VOIP de push a revocar (solo PushKit en iOS).
voip_token?
string
Token VOIP de push a desregistrar (solo PushKit en iOS).
Recuperar contraseña
Si un usuario olvida la contraseña, puede restablecerla usando su correo o teléfono. Para iniciar el proceso usar el endpoint Forgot Password.
El usuario debe obtener el token de reseteo de correo o SMS y luego usar Reset Password para definir una nueva contraseña.
Endpoints
Iniciar recuperación
POST /auth/forgot
No autenticado
Inicia el proceso enviando correo o SMS al usuario. Responde vacía 204 si es exitoso.
Parámetros JSON
login
string
Correo electrónico o número de teléfono E.164 del usuario.
Restablecer contraseña
POST /auth/reset
No autenticado
Resetea la contraseña y recupera un nuevo token de autenticación.
Parámetros JSON
1 Para WebAuthn, el parámetro code
debe ser un objeto JSON stringificado.
token
string
Token recibido por email o SMS.
password
string
Nueva contraseña (8-72 caracteres).
source?
string
Ruta fuente desde donde se inició el reseteo (por ejemplo /reset
).
method?
string
Tipo de autenticación para MFA.
ticket?
string
Ticket de MFA previo.
code?
string
Código MFA (TOTP, SMS, backup, o WebAuthn) a verificar.
Cuerpo de respuesta
token?
string
Token de autenticación si el reset se completó.
user_id?
snowflake
ID del usuario si se requiere MFA.
ticket?
string
Ticket para reintentar con MFA.
mfa?
boolean
Si es requerido MFA para restablecer (por defecto falso).
totp?
boolean
Si el usuario tiene habilitado TOTP.
sms?
boolean
Si tiene habilitado MFA por SMS.
backup?
boolean
Si se pueden usar backup codes.
webauthn?
?string
Cadena JSON de opciones WebAuthn.
Ejemplo completado
{ "token": "ODUyODkyMjk3NjYxOTA2OTkz.GX5Xdp.22jsdSqEiHLUYEJSsjeq_vJKLpOofd5QMksqw32e" }
Ejemplo con MFA requerido
{
"user_id": "852892297661906993",
"mfa": true,
"sms": true,
"ticket": "ODUyODkyMjk3NjYxOTA2OTkz.H2Rpq0.WrhGhYEhM3lHUPN61xF6JcQKwVutk8fBvcoHjo",
"backup": true,
"totp": true,
"webauthn": "{\"publicKey\":{\"challenge\":\"a8a1cHP7_zYheggFG68zKUkl8DwnEqfKvPE-GOMvhss\",\"timeout\":60000,\"rpId\":\"discord.com\",\"allowCredentials\":[{\"type\":\"public-key\",\"id\":\"izrvF80ogrfg9dC3RmWWwW1VxBVBG0TzJVXKOJl__6FvMa555dH4Trt2Ub8AdHxNLkQsc0unAGcn4-hrJHDKSO\"}],\"userVerification\":\"preferred\"}}"
}
Recuperación de cuenta
La recuperación de cuenta es una función pensada para recuperar cuentas después de una toma de control, cuando un atacante ya ha cambiado el email, contraseña, teléfono o ajustes de MFA.
Cuando se cambia el email, Discord enviará un mensaje notificando el cambio y ofreciendo al usuario la opción de iniciar la recuperación de cuenta. El correo incluirá un enlace que redirige al cliente oficial de Discord con un token de reversión en la URL (ejemplo: https://discord.com/wasntme/BIGJWTHERE
). Este token es válido por dos días.
Se puede usar este token con el endpoint Revert Account para revertir el estado previo de la cuenta. Al finalizar, se elimina el número actual de la cuenta y todos los anteriores quedan en lista negra para prevenir posteriores ataques SIM.
Endpoints
Revertir cuenta
POST /auth/revert
Recupera una cuenta después de una toma de control. Este endpoint:
Invalida el token de reversión usado
Invalida todos los tokens de autorización y sesiones Gateway asociadas
Devuelve el email original a la cuenta
Actualiza la contraseña al valor dado
Elimina el MFA de la cuenta
Elimina y pone en lista negra todos los teléfonos asociados previamente
Este proceso fallará si la cuenta fue eliminada previamente (ej. anti-spam o un empleado de Discord) o si el correo electrónico original fue asignado a una cuenta diferente.
Parámetros JSON
token
string
El token de reversión del correo de recuperación.
password
string
La nueva contraseña de la cuenta.
Cuerpo de respuesta
string
string
El correo restaurado de la cuenta.
Ejemplo de respuesta
{ "email": "alien@shiroko.me" }
Verificación MFA
En algunos casos se requerirá verificación MFA antes de realizar operaciones sensibles. Cuando esto suceda, recibirás un 401 con un cuerpo especial:
Estructura de respuesta MFA requerida
message
string
Mensaje indicando que se requiere MFA para la operación.
code
integer
Código de error (siempre será 60003
).
mfa
MFA verification request object
Objeto de solicitud de verificación MFA.
Estructura de solicitud de verificación MFA
ticket
string
Ticket MFA.
methods
array
Métodos MFA permitidos para verificar identidad.
Estructura de método MFA
type
string
El tipo de método MFA.
challenge?
string
Challenge JSON para WebAuthn.
backup_codes_allowed?
boolean
Si se pueden usar códigos de respaldo además de TOTP.
Tipos de autenticador
1 La contraseña solo se usa si el usuario no tiene otro MFA habilitado.
totp
Verificación usando TOTP o backup code.
sms
Verificación con código vía SMS.
backup
Verificación usando código de respaldo.
webauthn
Verificación usando dispositivo WebAuthn.
password
Verificación usando la contraseña.
Ejemplo de respuesta MFA requerida
{
"message": "Two factor is required for this operation",
"code": 60003,
"mfa": {
"ticket": "ODUyODkyMjk3NjYxOTA2OTkz.H2Rpq0.WrhGhYEhM3lHUPN61xF6JcQKwVutk8fBvcoHjo",
"methods": [
{
"type": "webauthn",
"challenge": "{\"publicKey\":{\"challenge\":\"a8a1cHP7_zYheggFG68zKUkl8DwnEqfKvPE-GOMvhss\",\"timeout\":60000,\"rpId\":\"discord.com\",\"allowCredentials\":[{\"type\":\"public-key\",\"id\":\"izrvF80ogrfg9dC3RmWWwW1VxBVBG0TzJVXKOJl__6FvMa555dH4Trt2Ub8AdHxNLkQsc0unAGcn4-hrJHDKSO\"}],\"userVerification\":\"preferred\"}}"
},
{
"type": "totp",
"backup_codes_allowed": true
},
{
"type": "sms"
},
{
"type": "backup"
}
]
}
}
Para verificar, usa el endpoint Verify MFA con el ticket recibido. El JWT recibido podrá insertarse en la cabecera X-Discord-MFA-Authorization
y reintentar la petición original.
Al elevar exitosamente, el JWT se entregará en la cookie __Secure-recent_mfa
, permitiendo saltar MFA 5 minutos.
Endpoints
Verificar MFA
POST /mfa/finish
Verifica la identidad del usuario usando autenticación multifactor. Si tiene éxito, retorna una cookie permitiendo saltar MFA durante 5 minutos.
Parámetros JSON
1 Para WebAuthn, el dato debe ser un JSON stringificado.
ticket
string
Ticket MFA recibido de la respuesta de MFA requerida.
mfa_type
string
El tipo de autenticador usado para verificar.
data
string
El dato de MFA (TOTP, SMS, backup, WebAuthn, o password) a verificar.
Cuerpo de respuesta
token
string
JWT de verificación MFA (expira en 5 minutos).
Ejemplo de respuesta
{
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJpYXQiOjE3MTA4MDY4MDQsIm5iZiI6MTcxMDgwNjgwNCwiZXhwIjoxNzEwODA3MTA0LCJpc3MiOiJ1cm46ZGlzY29yZC1hcGkiLCJhdWQiOiJ1cm46ZGlzY29yZC1tZmEtcmVwcm9tcHQiLCJ1c2VyIjo4NTI4OTIyOTc2NjE5MDY5OTN9.vOCStK0Aj873VaF_cLmSlcnAfw7SO0jrwSeCpkSUvO3li-1jxzwewxY4Ak4fyZvb6VeJtSW-r8_Pfw8HTj8P6w"
}
Enviar SMS MFA
POST /auth/mfa/sms/send
No autenticado
Envía un código MFA por SMS para la verificación.
Parámetros JSON
ticket
string
Ticket MFA recibido del login o de la respuesta MFA requerida.
Cuerpo de respuesta
phone
string
Número de teléfono enmascarado al que se envió el SMS.
Ejemplo de respuesta
{ "phone": "+*******0085" }