Как использовать REST API, который требует аутентификации по имени пользователя и паролю в node.js

Я хочу использовать REST API, который требует аутентификации по имени пользователя и паролю в node.js. Код, который потребляет API, выглядит следующим образом:

var request = require('request');

var url = 'http://localhost:3000/api/v1/login/'

request.get(url,{'auth': {'user': 'test35','pass': 'mypassword','sendImmediately': false}},function(err, httpResponse, body) {
  if (err) {
    return console.error('post failed:', err);
  }

  console.log('Post successful!  Server responded with:', body);
});

С приведенным выше кодом, я получаю ошибку:

{
  "status": "error",
  "message": "API endpoint does not exist"
}

API написан в Meteor Restivus, и вы можете увидеть его в ответе на следующий вопрос здесь

В API, когда я удаляю API-интерфейс authRequired: true, то есть удалить

{
        routeOptions: {
            authRequired: true
        }
  }

и в коде, который использует API выше, измените URL с

' http://localhost:3000/api/v1/login/

чтобы:

HTTP: // локальный: 3000 / API / v1 / статьи /

и запустить "узел accessRESTapi.js", я могу использовать API REST! То, что я не могу сделать правильно, это проверка подлинности, когда "authRequired: true" установлен, как указано выше! Пожалуйста помоги

1 ответ

Решение

РЕДАКТИРОВАТЬ: Обновлено на основе информации из комментариев

Стиль запроса сильно отличается между входом в систему для получения токена и последующими запросами:

Для входа

Документы указывают, что действия входа должны быть выполнены с POST запросить /api/login/ с телом, которое содержит username или же email а также password в качестве URL-закодированных параметров

var request = require('request');

var url = 'http://localhost:3000/api/v1/login/'
var user = 'test35';
var pass = 'mypassword';

// Save these for future requests
var userId;
var authToken;

// Use POST instead of GET
request.post(
  {
    uri: url,
    // I'm using form because it matches the urlEncoding behaviour expected by `restivus`
    form: { username: user, password: pass }
  },
  function(err, httpResponse, body) {
    if (err) {
      return console.error('post failed:', err);
    }
    var json = JSON.parse(body);
    authToken = json.data.authToken;
    userId = json.data.userId;
    console.log('Post successful!  Server responded with:', body);
  }
);

Для будущих запросов

Теперь вам нужно установить правильные заголовки с ранее сохраненными userId а также authToken

Согласно документам, это означает, что X-User-Id а также X-Auth-Token заголовки на все последующие запросы

var request = require('request');

var url = 'http://localhost:3000/api/v1/articles/'

request.get({
  uri: url, 
  headers: {
    'X-User-Id': userId,
    'X-Auth-Token': authToken
  }
}, function(err, httpResponse, body) {
  if (err) {
    return console.error('post failed:', err);
  }

  console.log('Get successful!  Server responded with:', body);
});

Собираем это вместе:

Мы хотим убедиться, что мы получаем authToken прежде чем делать какие-либо дальнейшие запросы.

Это означает выполнение второго запроса в обратном вызове первой функции следующим образом:

var request = require('request');

var url = 'http://localhost:3000/api/v1/login/';
var user = 'test35';
var pass = 'mypassword';

// Save these for future requests
var userId;
var authToken;

// Use POST instead of GET
request.post(
  {
    uri: url,
    // I'm using form because it matches the urlEncoding behaviour expected by `restivus`
    form: { username: user, password: pass }
  },
  function(err, httpResponse, body) {
    if (err) {
      return console.error('post failed:', err);
    }
    var json = JSON.parse(body);
    authToken = json.data.authToken;
    userId = json.data.userId;
    console.log('Post successful!  Server responded with:', body);

    // And now we make the second request
    // Welcome to callback hell
    var articlesUrl = 'http://localhost:3000/api/v1/articles/';

    request.get({
      uri: articlesUrl, 
      headers: {
        'X-User-Id': userId,
        'X-Auth-Token': authToken
      }
    }, function(err, httpResponse, body) {
      if (err) {
        return console.error('post failed:', err);
      }

      console.log('Get successful!  Server responded with:', body);
    });
  }
);
Другие вопросы по тегам