登录后重定向到个人资料网址

时间:2019-01-07 07:31:14

标签: node.js express login routes

我是后端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中访问用户的详细信息?

3 个答案:

答案 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));
}

jwt.verify - jwt doc

答案 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.' 
    });

  }
});

帮助:jwt - decode and save in req

答案 2 :(得分:0)

在代码中,return之后,您的redirect将永远无法工作。所以有2个选项:

  1. 您不需要将令牌返回给客户端,只需在验证后使用res.redirect('/profile')。 (这样,您的服务器和客户端就在同一台)

  2. 您只需将令牌返回给客户端(不再使用res.redirect('/profile')),然后客户端将使用该令牌重定向到配置文件。 (通过这种方式,您的服务器和客户端彼此分离)。