web-dev-qa-db-ja.com

oauth2エラーAADSTS90014:要求の本文には、次のパラメーターが含まれている必要があります: 'grant_type'

Windevの開発から、ユーザーからOutlookメールへのアクセスを取得するための認証にOauth 2.0を使用します。

アプリケーションは https://apps.dev.Microsoft.com で暗黙的なワークフローなしで登録されます。ユーザーが資格情報を入力すると、認証コードが返されます。新しいコードでは、ベアラトークンがHTTP Postコマンドで要求されます。

ここまでは順調ですね。

応答が私には意味のないエラーメッセージを与えることだけ。

コード内:

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

ログファイルで、使用したパラメーターと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'.

Grant_typeは、ヘッダーにあるはずです。

OAUTH2を機能させるために必要なものの手がかりはありますか?

6
Adjan

Paramsでもheadersでもgrant_typeを送信しないでください。これらはbody paramsで送信する必要があり、それだけが機能します。 URL: https://login.microsoftonline.com/common/oauth2/v2.0/token client_id、scopeおよびredirect_uriパラメーターは、クエリパラメーターとして送信できます。ここで、grant_type、codeおよびclient_secretはbody paramsで送信する必要があります。

grant_type:authorization_code、コード:{認証ステップから取得したコード}、client_secret:****

これによれば post oauth-2.0パラメーターはリクエストのコンテンツに含まれている必要があります。もう試しましたか?この post は、本文のエンコードについても警告します。

4
Bidjes

「デフォルトのスコープ」の値をフルネームの例にする必要がある場合、「User.Read」の正しい値はAzure AD APPから取得できます-> APIのアクセス許可