我是后端Node.js的新手,到目前为止,我已经能够完成注册和身份验证登录。
登录时,我通过使用jwt令牌获得令牌作为响应
现在我想让注册详细信息在登录后向用户显示。登录后,详细信息必须是特定用户的唯一登录信息。
如果管理员正在登录,那么他将获得整个数据库用户的字段。
这是我的 index.route:-
const express = require ('express');
const router = express.Router();
const mongoose = require ('mongoose');
const User = mongoose.model('User');
const ctrlUser = require ('../controllers/user.controller.js');
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
const passport = require('passport');
// routing functions
//registartion user signup
router.post('/register' , ctrlUser.register);
//login user
router.post('/login' , (req, res, next) => {
User.find({email: req.body.email})
.exec()
.then(user => {
if(user.length < 1) {
return res.status(401).json({
message: "Auth failed. User not found."
})
}
bcrypt.compare(req.body.password, user[0].password, (err, result) =>{
if (err) {
return res.status(401).json({
message: "Auth failed. Check email and password"
});
}
if (result){
const adminEmail = "rohit@metapercept.com";
const role = user[0].email===adminEmail? "admin" : "user"; //check user id as admin or user
const token = jwt.sign(
{
email: user[0].email,
userId: user[0]._id,
role
},
process.env.JWT_KEY,
{
expiresIn : "1h"
});
return res.status(200).json({
message: "Auth Successful",
token : token
});
res.redirect('/profile');
}
});
})
.catch(err =>{
if (err.code == 500)
res.status(500).send(["Something went wrong in login"]);
else
return next(err);
});
});
router.get('/profile', function(req, res, next){
//something todo here ...
});
//delete user
router.delete('/:userId' , (req, res, next) =>{
User.deleteMany({_id: req.params.userId})
.exec()
.then(result => {
res.status(200).send(["Deleted"]);
})
.catch(err =>{
if (err.code == 500)
res.status(500).send(["Didn't get deleted"]);
else
return next(err);
});
});
module.exports = router;
如何在配置文件URL API中访问用户的详细信息?
答案 0 :(得分:0)
从请求标头获取JWT,然后解码
private fetch(action: string = '', data?: any): Observable<any[]> {
return this.http
.jsonp(`https://jsonplaceholder.typicode.com/posts/${action}?${this.serializeModels(data)}`, 'callback')
.pipe(map(res => <any[]>res));
}
答案 1 :(得分:0)
创建新的中间件(位于其他路径上方)
// route middleware to verify a token
router.use(function(req, res, next) {
// check header or url parameters or post parameters for token
var token = req.body.token || req.query.token || req.headers['x-access-token'];
// decode token
if (token) {
// verifies secret and checks exp
jwt.verify(token, app.get('superSecret'), function(err, decoded) { if (err) {
return res.json({ success: false, message: 'Failed to authenticate token.' }); } else {
// if everything is good, save to request for use in other routes
req.decoded = decoded; next();
}
});
} else {
// if there is no token
// return an error
return res.status(403).send({
success: false,
message: 'No token provided.'
});
}
});
答案 2 :(得分:0)
在代码中,return
之后,您的redirect
将永远无法工作。所以有2个选项:
您不需要将令牌返回给客户端,只需在验证后使用res.redirect('/profile')
。 (这样,您的服务器和客户端就在同一台)
您只需将令牌返回给客户端(不再使用res.redirect('/profile')
),然后客户端将使用该令牌重定向到配置文件。 (通过这种方式,您的服务器和客户端彼此分离)。