2017-07-09 48 views
1

您好初学者Nodejs我已经使用passportjs基于令牌的身份验证如果用户登录它为每个用户提供一个令牌我想执行一些操作基于令牌值,例如,如果用户希望看到注册用户列表,他们可以查看它,如果他有令牌值的话。现在它为Postman提供了完美的令牌值,但我不知道如何将它存储在变量中并通过FRONT-END调用它。我想通过前端做到这一点(如果他点击获取用户按钮)它应该显示用户列表。我已经在POSTMAN做到了这一点,它工作得很好,我不知道如何通过前端做到这一点。 我的用户密码(登录/注销)如何将令牌值存储到我的本地JavaScript文件

var express = require('express'); 
var router = express.Router(); 
var User = require('../models/user'); 
var passport = require('passport'); 
var Verify = require('./verify'); 
/* GET users listing. */ 
router.route('/') 
.get(Verify.verifyOrdinaryUser, function(req, res, next) { 
    User.find({}, function (err, users) { 
      if (err) throw err; 
      res.json(users); 
     }); 
}); 
router.post('/register', function(req, res, next) { 
    User.register(new User({ username : req.body.username }),req.body.password, function(err, user) { 
     if (err) { 
      return res.status(500).json({err: err}); 
     } 
     user.save(function(err,user) { 
      passport.authenticate('local')(req, res, function() { 
       return res.status(200).json({status: 'Registration Successful!'}); 
      }); 
     }); 
    }); 
}); 
router.post('/login', function(req, res, next) { 
    passport.authenticate('local', function(err, user, info) { 
     if (err) { 
      return next(err); 
     } 
     if (!user) { 
      return res.status(401).json({ 
       err: info 
      }); 
     } 
     req.logIn(user, function(err) { 
      if (err) { 
       return res.status(500).json({ 
        err: 'Could not log in user' 
       }); 
      } 
      var token = Verify.getToken(user); 
      res.status(200).json({ 
       status: 'Login successful!', 
       success: true, 
       token: token 
      }); 
     }); 
    })(req,res,next); 
}); 
router.get('/logout', function(req, res) { 
     req.logout(); 
    res.status(200).json({ 
     status: 'Bye!' 
    }); 
}); 
module.exports = router; 

Main.js文件。在这个main.js文件中,我想在这个get方法中发送该标记任何想法?

$(".get-users-button").click(function() { 
    $.ajax({ 
     method: "GET", 
     url: " http://localhost:3000/users" 
    }) 
    .done(function(msg) { 
     console.log(msg); 
     template(msg); 
    }); 
}); 
+0

当您的用户登录时,只需在浏览器中将令牌作为cookie发送,每次您只需检索它即可。 –

+0

@ArpitSolanki这是一个好主意bro和存储在localstorage中,但我想将它作为变量bro存储,所以有其他想法? – Kannan

回答

0

按照该documentation的护照:

如果验证成功,接下来的处理程序将被调用和req.user属性将被设置为通过验证的用户。

现在,如果我理解正确你的问题,你想通过token值从获得:

var token = Verify.getToken(user) 

在其中您的前端可以做的东西的看法。你可以通过变量使用以下中间件的观点:

app.use((req, res, next) => { 
    res.locals.token = Verify.getToken(req.user) 
    next() 
} 

有关详细信息,请参阅res.locals的文档。


用法示例:

app.js

const express = require('express') 
const app = express() 

app.set('view engine', 'pug') 

app.use((req, res, next) => { 
    res.locals.text = 'asdf' 
    res.locals.token = 'abc' 
    next() 
}) 

app.get('/', (req, res) => { 
    res.render('index') 
}) 

app.listen(3000,() => { 
    console.log('listening on 3000') 
}) 

views/index.pug

doctype html 
html 
    head 
    title= title 
    body 
    h1= text 
    script. 
    console.log('#{token}') 
+0

嗨弗朗西斯科你已经理解我的问题,但我不明白你提到的最后一个例子,你想要传递变量你想我添加你的代码旁边的var令牌= verify.getToken(用户)。即使是,我怎么能访问我的main.js文件有点困惑,你可以详细说明我 – Kannan

+0

它只是中间件。如果您不了解中间件,请参阅express文档获取信息或者提出其他问题。据说,上述中间件会将令牌传递给_every_请求,并且我已经更新了我的答案以包含一个示例。 –

+0

感谢您的帮助,我已经使用localstorage并传递给客户端 – Kannan

0

当你回到从POST到/登录终端的成功响应,存储在令牌客户端(例如,window.localStorage.setItem('<your-namespace>-user-token', <the token goes here>);

然后,当用户点击“获取用户按钮”时,将令牌从存储中取出(例如,window.localStorage.getItem('<your-namespace>-user-token');并将其存储在变量中,如果需要的话)。

然后,根据您的要求获取用户,请将您的{ 'x-access-token': <token variable goes here> }添加到您的请求标题中。

+0

感谢您的答案兄弟,但任何想法如何传递令牌值,如果用户登录,并在这里传递? – Kannan

+0

Bro完成存储在本地存储和我的标题是不同的标题:{ \t \t'x-access-token':token \t \t} – Kannan

相关问题