web-dev-qa-db-fra.com

Erreur oauth2 AADSTS90014: Le corps de la demande doit contenir le paramètre suivant: 'grant_type'

Depuis le développement dans Windev, j'utilise Oauth 2.0 pour l'autorisation d'accéder à la messagerie Outlook d'un utilisateur.

L'application est enregistrée sur https://apps.dev.Microsoft.com sans le workflow implicite. Une fois que l'utilisateur a saisi les informations d'identification, un code d'autorisation est renvoyé. Avec le nouveau code, le jeton de porteur est demandé avec une commande HTTP Post.

Jusqu'ici tout va bien.

Seulement que la réponse donne un message d'erreur qui n'a aucun sens pour moi.

Dans du code:

m_sHTTPUrl = "client_id=" + m_sClientID + "&client_secret=" ...
    + m_sClientSecret ...
    + "&redirect_uri=" + m_sRedirectURL + "&code=" + m_sAuthToken ...
    + "&grant_type=authorization_code"
m_sHTTPres = ""
LogLocalFile("GetAccessToken - " + m_sTokenURL + " // " + m_sHTTPUrl) 

cMyRequest is httpRequest
cMyRequest..Method = httpPost
cMyRequest..URL = m_sTokenURL
cMyRequest..ContentType = "application/x-www-form-urlencoded"
cMyRequest..Header["grant_type"] = "authorization_code"
cMyRequest..Header["code"] = m_sAuthToken
cMyRequest..Header["client_id"] = m_sClientID
cMyRequest..Header["client_secret"] = m_sClientSecret
cMyRequest..Header["scope"] = m_sScope
cMyRequest..Header["redirect_uri"] = m_sRedirectURL
//cMyRequest..Content = m_sHTTPUrl
cMyResponse is httpResponse = HTTPSend(cMyRequest)
m_sHTTPres = cMyResponse.Content

Dans un fichier journal, j'ai demandé les paramètres utilisés et le contenu de httpResponse:

GetAccessToken - https://login.microsoftonline.com/common/oauth2/v2.0/token // grant_type=authorization_code
&code=xxxxxxx
&scope=openid+offline_access+User.Read+Email+Mail.Read+Contacts.Read
&redirect_uri=http://localhost/
&client_id=xxxxxxx
&client_secret=xxxxxxx

GetAccessToken - error = invalid_request
GetAccessToken - error_description = AADSTS90014: The request body must contain the following parameter: 'grant_type'.

Le grant_type est dans l'en-tête comme il est censé l'être.

Quelqu'un a-t-il une idée de ce qui est nécessaire pour faire fonctionner OAUTH2?

6
Adjan

Vous ne devez pas envoyer grant_type ni dans les paramètres ni dans les en-têtes, ceux-ci doivent être envoyés dans les paramètres du corps alors seulement cela fonctionnera. Url: https://login.microsoftonline.com/common/oauth2/v2.0/token les paramètres client_id, scope et redirect_uri peuvent être envoyés en tant que paramètres de requête. où comme grant_type, le code et le client_secret doivent être envoyés dans les paramètres du corps.

grant_type: autorisation_code, code: {code que vous avez obtenu à l'étape d'autorisation}, client_secret: ****

4

Selon cela post les paramètres oauth-2.0 doivent être dans le contenu de votre demande. L'avez-vous déjà essayé? Ce post met également en garde contre l'encodage du corps.

4
Bidjes

lorsque la valeur "Étendue par défaut" doit être un exemple de nom complet, la valeur correcte "User.Read" peut être obtenue à partir d'Azure AD APP -> Autorisation Api