3
votes

OAuth2: l'API Discord répond toujours par {"error": "invalid_grant"}

J'essaie d'implémenter Discord OAuth2 dans mon application node.js. Dès que j'essaye d'obtenir le jeton d'accès à partir du code d'autorisation donné, j'obtiens toujours la réponse HTTP Error 400 {"error": "invalid_grant"}

let xhr = new XMLHttpRequest()
xhr.open('POST', 'https://discord.com/api/oauth2/token')

xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')

let payload ={
    client_id: clientID,
    client_secret: clientSecret,
    grant_type: 'authorization_code',
    code: code,
    redirect_uri: redirectUrl,
    scope: 'identify'
};

console.log(payload)
xhr.send(JSON.stringify(payload))

xhr.onreadystatechange = () => {
    console.log(xhr.status)
    console.log(xhr.responseText)
}

xhr.onerror = () => {
    console.log('Failed')
}


0 commentaires

3 Réponses :


1
votes

D'accord, j'ai résolu le problème. Pour tous ceux qui rencontrent le même problème que moi, je l'ai résolu en utilisant axios et querystring pour envoyer la requête POST à l'API Discord ( https://github.com/discord/discord-api-docs/issues/1131 )

Il semble qu'il y ait un problème avec le JSON et le format x-www-form-urlencoded.


0 commentaires

0
votes

la charge utile ne doit pas être un objet js mais une donnée de formulaire ie

let payload = new FormData();
payload.append("key in string","value in string")


1 commentaires

et changez le type de contenu en multipart / form-data



1
votes

J'ai eu le même problème en essayant d'utiliser la fonction GetServerSideProps de Next.js.

Après avoir beaucoup cherché, j'ai trouvé un problème fermé sur Github résolvant ce problème (problème Github: Deep Linking with OAuth2 Not Working ). Fondamentalement, nous ne pouvions pas utiliser d'objet JSON sur le corps de la demande d'authentification. Nous devons utiliser l'objet URLSearchParams la place.

La charge utile devrait ressembler à:

const payload = new URLSearchParams()

payload.append('client_id', process.env.DISCORD_CLIENT_ID)
payload.append('client_secret', process.env.DISCORD_CLIENT_SECRET)
payload.append('grant_type', 'authorization_code')
payload.append('redirect_uri', process.env.DISCORD_REDIRECT_URI)
payload.append('code', accessCode)
payload.append('scope', 'identify')


0 commentaires