Как использовать 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 с
чтобы:
и запустить "узел 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);
});
}
);