La solicitud GET de Axios a la API de discordia da una respuesta prohibida 403, pero funciona en Postman

Aug 18 2020

Estoy usando axios para realizar una solicitud HTTP GET a la API de discords en mi entorno local.

Estoy usando el siguiente código:

axios.get('https://discord.com/api/channels/735303230694621228', {
    withCredentials: true,
    headers: {
      Authorization: 'Bot ' + botToken,
    },
  }).then((data) => {
    res = data.response
  })

El Bot es el propietario del ID de canal: 735303230694621228 y tiene todos los permisos correctos.

Resultado actual:

La solicitud de verificación previa (OPCIONES) da una respuesta de 200 con todos los encabezados correctos.

Después de la verificación previa, se producirá la solicitud GET y me dará la siguiente respuesta:

403 Forbidden

El navegador también dará un error CORS, pero estoy bastante seguro de que se debe a la respuesta 403, ya que el 403 no da todos los encabezados CORS correctos.

Resultado Esperado:

Status 200 OK

lo intento https://discord.com/api/channels/735303230694621228 con Postman con el mismo token de Bot y me da una respuesta de 200 con el cuerpo esperado.

¿Alguien tiene alguna idea de por qué obtengo un 403 cuando uso axios con el navegador en mi entorno local, pero obtengo una respuesta de 200 con el cartero?

Respuestas

1 jakxnz Aug 20 2020 at 05:45

Discord responde con a 403para algunos User-Agent s en algunos recursos de API.

Para probar esto, envíe una solicitud de Postman con su User-Agentencabezado configurado en un valor que coincida con un navegador, por ejemploUser-Agent: Mozilla/5.0

Lamentablemente, el navegador anulará el User-Agentencabezado en un axios.get(), incluso si define uno en su .get()configuración.

La anterior es la razón por la que Postman ( User-Agent: PostmanRuntime/7.0.0) recibe una 200respuesta, pero su navegador ( User-Agent: Mozilla/5.0) recibe un 403.


Vale la pena señalar que la documentación de la API de Discord no explica esto (a agosto de 2020)https://discord.com/developers/docs/resources/channel#get-channel