Microsoft Azure - OAuth2 - "invalid_request" - PullRequest
0 голосов
/ 15 января 2019

Я бы хотел подключить свое приложение к Microsoft Graph. Я создал свое веб-приложение в Azure (у меня есть client_id и client_secret). Я могу отправить запрос на получение кода авторизации от https://login.microsoftonline.com/common/oauth2/v2.0/authorize.

Проблема в том, что когда я отправляю запрос POST, чтобы получить токен доступа от https://login.microsoftonline.com/common/oauth2/v2.0/token (точно так же, как было сказано здесь в разделе "Использование разрешений"), используя Postman (с * Опция 1010 *), появляется сообщение об ошибке «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, все выглядит нормально.

Я могу отправлять только POST запросы в формате JSON в моем приложении.

Поддерживает ли Microsoft Graph формат JSON для запросов POST?

Это проблема почтальона?

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Это не проблема Microsoft или Postman, просто OAuth определяет рабочий процесс токена. Это определено в RFC 6749 - Раздел 4.1.3 :

Клиент отправляет запрос конечной точке токена, отправляя следующие параметры в формате application/x-www-form-urlencoded в Приложении B с кодировкой символов UTF-8 в теле объекта HTTP-запроса

0 голосов
/ 20 февраля 2019

Я столкнулся с подобной проблемой, но понял, что существует несоответствие между заголовком Content-Type: application/x-www-form-urlencoded и телом запроса в формате JSON. Если вы обратитесь к этой документации , вы увидите, что тело запроса должно быть закодировано в URL (объединено с амперсандами, закодированными объектами и т. Д.), Что в конечном итоге решило мою проблему. Поэтому я не думаю, что это проблема Postman или MS API, а скорее просто неправильное форматирование тела вашего запроса.

Я не уверен, какой язык использует ваше приложение, но вот пример использования Node и 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
  }
}

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...