Ошибка request.js, когда CURL успешно выполняется для запроса GET с заголовком авторизации.

Я могу сделать запрос GET с заголовком авторизации от curl но не из request или же https в Node.js. Сервер возвращает статус 200 с curl, но 500 с request или же https, Как может позвонить request или же https быть отличным от curl? Как сервер может читать их по-другому?

Следующий cURL успешно выполняется из командной строки:

curl -H "Authorization:  Bearer abc123def456" https://api.domain.com/path/to/resource

Но тот же запрос терпит неудачу с request.js в узле

var options = {
  type: 'get',
  url: "https://api.domain.com/path/to/resource",
  headers: {
     "Authorization": " Bearer abc123def456" 
  }
}
request(options, function (err, response, body) {
  assert.equal(response.statusCode, 200) ; // 500 internal error
})

Следующее также не работает с request.js, использующим auth опция:

var options = {
  type: 'get',
  url: "https://api.domain.com/path/to/resource",
  auth: {
    "bearer": "abc123def456" 
  }
}
request(options, function (err, response, body) {
  assert.equal(response.statusCode, 200) ; // 500 internal error
})

Это также не удается при использовании https без request.js:

var options = {
  host: 'api.domain.com',
  port: 443,
  path: '/path/to/info',
  method: 'GET',
  headers: {
    "Authorization": " Bearer abc123def456"
  }
}
var req = https.request(options, function (res) {
  res.setEncoding('utf8');
  res.on('end', function () {
    assert.equal(res.statusCode, 200) // 500 internal error
  })
});

req.on('error', function (e) {
  console.log('problem with request: ' + e.message);
});

req.end();

Но запросы curl успешно выполняются, если они выложены из Node:

exec("curl -H "Authorization:  Bearer abc123def456" https://api.domain.com/path/to/resource", function (error, stdout, stderr) {
  var obj = JSON.parse(stdout) // successfully retrieved and parsed
});

request-debug дает следующую информацию:

{ request: 
   { debugId: 1,
     uri: 'https://api.domain.com/path/to/resource',
     method: 'GET',
     headers: 
      { host: 'api.domain.com',
        authorization: 'Bearer abc123def456' } } }

1 ответ

Решение

Внутренняя ошибка 500 обычно означает, что ошибка на стороне сервера. Итак, в идеале, вы должны смотреть на журналы сервера.

Однако, если у вас нет доступа к этим журналам, посмотрите на разницу между запросами, отправленными каждым из опций, которые вы пробовали:

Модуль: Запрос (с указанным вручную заголовком аутентификации):

GET /path/to/resource HTTP/1.1
Authorization:  Bearer abc123def456
host: api.domain.com

Модуль: Запрос (с явно указанным заголовком аутентификации):

GET /path/to/resource HTTP/1.1
host: api.domain.com
authorization: Bearer abc123def456

Модуль: HTTP (с указанным вручную заголовком аутентификации):

GET /path/to/info HTTP/1.1
Authorization:  Bearer abc123def456
Host: api.domain.com

Скручивание:

GET /path/to/resource HTTP/1.1
Host: api.domain.com
User-Agent: curl/7.51.0
Accept: */*
Authorization:  Bearer abc123def456

Совершенно очевидно, что остальные модули не отправляют HTTP-заголовки "User-Agent" и "Accept". Таким образом, это может быть случай, когда приложение, запущенное на сервере, пытается проанализировать хотя бы один из них и завершается неудачно.

Другие вопросы по тегам