Microsoft Azure-OAuth2-“ invalid_request”

时间:2019-01-14 22:05:57

标签: azure-active-directory postman microsoft-graph

我想将我的应用程序与Microsoft Graph连接。我在Azure中创建了Web应用程序(我有client_idclient_secret)。我可以发送请求以从https://login.microsoftonline.com/common/oauth2/v2.0/authorize获取授权码。

问题是,当我使用邮递员(Postman)发送POST请求以便从https://login.microsoftonline.com/common/oauth2/v2.0/token获取访问令牌(与“使用权限”部分中的here一样)时,使用form-data选项),我收到“ AADSTS9000410:JSON格式错误”错误:

{
  "error": "invalid_request",
  "error_description": "AADSTS9000410: Malformed JSON.\r\nTrace ID: f5c1dd4b-ad43-4265-91cb-1b7392360301\r\nCorrelation ID: 1dea54ed-bb43-4951-bc9e-001877fe427b\r\nTimestamp: 2019-01-14 21:38:42Z",
  "error_codes": [9000410],
  "timestamp": "2019-01-14 21:38:42Z",
  "trace_id": "f5c1dd4b-ad43-4265-91cb-1b7392360401",
  "correlation_id": "1dea54ed-bb43-4951-bc9e-001878fe427b"
}

此外,当我在Postman中使用原始选项发送相同的请求时,我得到“ AADSTS900144:请求正文必须包含以下参数:'grant_type'”:

 {
  "error": "invalid_request",
  "error_description": "AADSTS900144: The request body must contain the following parameter: 'grant_type'.\r\nTrace ID:a7c2f8f4-1510-42e6-b15e-b0df0865ff00\r\nCorrelation ID:e863cfa9-0bce-473c-bdf6-e48cfe2356e4\r\nTimestamp: 2019-01-1421:51:29Z",
  "error_codes": [900144],
  "timestamp": "2019-01-14 21:51:29Z",
  "trace_id": "a7c2f8f4-1510-42e6-b15e-b0df0865ff10",
  "correlation_id": "e863cfa9-0bce-473c-bdf6-e48cfe2356e3"
}

但是,当我在邮递员的标头中删除application/json并放入x-www-form-urlencoded选项时,一切看起来都很好。

我只能在应用程序中发送JSON格式的POST请求。

Microsoft Graph是否支持POST请求的JSON格式?

这是邮递员问题吗?

2 个答案:

答案 0 :(得分:0)

我遇到了类似的问题,但意识到Content-Type: application/x-www-form-urlencoded标头和JSON格式的请求正文之间不匹配。如果您引用this documentation,则会看到请求正文需要进行URL编码(与&符,编码的实体等连接),最终解决了我的问题。因此,我认为这不是Postman或MS API的问题,而是您的请求正文格式错误。

我不确定您的应用使用哪种语言,但是下面是使用Node and Express的示例:

const fetch = require('node-fetch')
const { URLSearchParams } = require('url')

async function getAccessToken(req, res, next) {
  try {
    const response = await fetch('https://login.microsoftonline.com/common/oauth2/v2.0/token', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded'
      },
      // Previously I was doing `body: JSON.stringify({...})`, but
      // JSON !== URL encoded. Using `URLSearchParams` (or whatever
      // the equivalent is in your language) is the key to success.
      body: new URLSearchParams({
        client_id: YOUR_CLIENT_ID_HERE,
        scope: 'User.Read Calendars.Read',
        redirect_uri: YOUR_REDIRECT_URL_HERE,
        grant_type: 'authorization_code',
        client_secret: YOUR_CLIENT_SECRET_HERE,
        code: req.query.code
      }
    })
    const json = await response.json()
    // `json` will have `access_token` and other properties
  } catch (err) {
    throw err
  }
}

希望有帮助!

答案 1 :(得分:0)

这既不是Microsoft也不是Postman的问题,这只是OAuth如何定义令牌工作流。在RFC 6749 - Section 4.1.3中定义:

  

客户端通过按照附录B使用 application/x-www-form-urlencoded 格式发送以下参数,并在HTTP请求实体主体中使用UTF-8字符编码,向令牌端点发出请求