В настоящее время я внедряю аутентификацию JWT - я реализовал ее в соответствии с этим руководством: https://medium.com/dev-bits/a-guide-for-adding-jwt-token-based-authentication-to-your-single-page-nodejs-applications-c403f7cf04f4. И хотя мой код работает, я не могу понять, как отправить запрос на публикацию с моего angular фронта с паролем и именем пользователя. Учебник использует эту команду для запуска в терминале для входа в систему:
curl --header "Content-Type: application/json" \
--request POST \
--data '{"password":"password", "username":"admin"}' \
http://localhost:8000/login
Как я могу преобразовать эту команду в пост-запрос в форме:
http.post('URL', <data>)
, чтобы я мог сделать запрос из внешнего интерфейса?
Когда внутренний запрос обрабатывается после отправки запроса на вход в систему, это вызывает метод login класса HandlerGenerator, который вы можете найти здесь:
const express = require('express');
const bodyParser = require('body-parser');
let jwt = require('jsonwebtoken');
let config = require('./config');
let middleware = require('./middleware');
class HandlerGenerator {
login (req, res) {
let username = req.body.username;
let password = req.body.password;
// For the given username fetch user from DB
let mockedUsername = 'admin';
let mockedPassword = 'password';
if (username && password) {
if (username === mockedUsername && password === mockedPassword) {
let token = jwt.sign({username: username},
config.secret,
{ expiresIn: '24h' // expires in 24 hours
}
);
// return the JWT token for the future API calls
res.json({
success: true,
message: 'Authentication successful!',
token: token
});
} else {
res.send(403).json({
success: false,
message: 'Incorrect username or password'
});
}
} else {
res.send(400).json({
success: false,
message: 'Authentication failed! Please check the request'
});
}
}
index (req, res) {
res.json({
success: true,
message: 'Index page'
});
}
}
// Starting point of the server
function main () {
let app = express(); // Export app for other routes to use
let handlers = new HandlerGenerator();
const port = process.env.PORT || 3000;
////////////////////////////////////////////////////////////////////////////////////
app.use(bodyParser.urlencoded({ // Middleware
extended: true
}));
app.use(bodyParser.json());
// catch 404 and forward to error handler
app.use(function(req, res, next) {
let err = new Error('Not Found');
err.status = 404;
next(err);
});
////////////////////////////////////////////////////////////////////////////////////
// Routes & Handlers
app.get('/', middleware.checkToken, handlers.index);
////////////////////////////////////////////////////////////////////////////////////
app.post('/login', handlers.login);
////////////////////////////////////////////////////////////////////////////////////
app.listen(port, () => console.log(`Server is listening on port: ${port}`));
module.exports = app;
}
main();
В случае, если сделан запрос с токеном вместо информации для входа в систему, для проверки токена используется промежуточное программное обеспечение:
let jwt = require('jsonwebtoken');
const config = require('./config.js');
let checkToken = (req, res, next) => {
let token = req.headers['x-access-token'] || req.headers['authorization']; // Express headers are auto converted to lowercase
if (token) {
if (token.startsWith('Bearer ')) {
// Remove Bearer from string
token = token.slice(7, token.length);
}
jwt.verify(token, config.secret, (err, decoded) => {
if (err) {
return res.json({
success: false,
message: 'Token is not valid'
});
} else {
req.decoded = decoded;
next();
}
});
} else {
return res.json({
success: false,
message: 'Auth token is not supplied'
});
}
};
module.exports = {
checkToken: checkToken
};
Если вы могли бы рассказать мне, как преобразовать команду, используемую для входа через Терминал в правильный почтовый запрос, который может быть использован у меня, это было бы очень полезно ... Большое спасибо за вашу помощь!
С уважением, Сэм