Node.js:login后在URL中用令牌(JWT)发送新的请求

在用户login并生成一个令牌后,我想在头部或类似的地方自动发送它。

到目前为止,我设法生成令牌,并检查它是否存在,如果它是有效的,似乎工作正常,只要我复制粘贴它的url为“?令牌=生成的令牌”。

我无法理解如何发送邮件,而无需自己写在邮递员的URL中。

我正在使用这些模块:

  • performance
  • 身体parsing器
  • mongoose
  • JsonWebToken

所以我很好奇,如果我select只在login的时候生成token,如果我需要把它添加到用户的Schema中。

我现在不想使用护照,因为我想先了解基本知识。

在search了一段时间(包括jwt文档)之后,我没有真正find可以理解和实现的东西。

所以在这里,如果有人能指引我朝着正确的方向发展,那会很棒。

对不起,缩进和感谢提前。

这里是一些代码:

智威汤逊- middleware.js

var jwt = require('jsonwebtoken'); var secret = 'mySecret'; module.exports = function (req, res, next) { var token = req.body.token || req.headers['x-access-token'] || req.query.token; if(!token) { return res.status(404).send({error:'No token found'}); } else { jwt.verify(token, secret, function(err, decode) { if(err) { return res.status(500).send({error:'Invalid token'}); } else { // req.decode = decode; decode = jwt.decode(token, {complete:true}); //console.log(req.headers); // req.headers.authorization = token; // console.log(req.headers.authorization); console.log(decode.header); console.log(decode.payload); next(); } }); } } 

路线/ user.js的

  var express = require('express'); var router = express.Router(); var mongoose = require('mongoose'); var jwt = require('jsonwebtoken'); var expressJwt = require('express-jwt'); var verifyToken = require('../config/jwt-middleware'); var secret = 'mySecret'; //Import models var User = require('../models/users'); router.get('/', verifyToken, function (req, res) { User.find({}, function (err, storedUsers) { if (err) { return res.status(500).send({ error: 'No users found' }); } else { return res.status(200).send(storedUsers); } }); }); router.post('/login', function (req, res) { User.find().lean().exec(function (err, doc) { for (var i = 0; i < doc.length; i++) { if (req.body.username == doc[i].username && req.body.password == doc[i].password) { var token = jwt.sign({username:req.body.username}, secret, {expiresIn:'1h'}); return res.status(200).send('You\'re now logged in ' + 'with the username: ' + doc[i].username + ' and password: ' + doc[i].password + ' \nJSON token: \n' + token); } } return res.status(404).send({ error: 'Invalid username or password: ' + req.body.username }); }); }); 

一些截图:

没有令牌

login

手动插入标记

好的,所以我会试着回答你的问题,即使我不是100%确定我明白你在问什么。 JWT的基本stream程是用户login,然后发布。 你不存储它,因为JWT的全部重点是在服务器上没有用于存储它的开销(允许更分散的用户pipe理方法)。 例外是,如果你想做一个注销function,但看起来不是你的要求之一。

从责任的angular度来看,您应该有一个loginfunction或模块,负责validation用户的凭证并发出令牌。 您应该有validationfunction或模块validation令牌,并将解码的令牌放置在请求对象上供以后使用(不需要重复解码)。 你可以(或不可以)有一个授权模块来validation给定的用户是否被允许执行给定的任务。

所以,从顶部。 请注意,您可以让数据库执行查询工作,而不是执行您自己的循环。 我还假设您的用户架构将包含一个verifyPassword方法,负责比较腌制密码和散列密码。

 // login router.post('/login', function (req, res, next) { // note I didn't use lean() because I want access to User methods. Performance is less of an issue in my version, b/c the DB is only retrieving one user at most. User.findOne({ username: req.body.username }).exec(function (err, user) { if(err) return next(err); if(!user) return res.status(401).send(); if (user.verifyPassword(req.body.password)) { // maybe add more info about the user, like display name var token = jwt.sign({username:user.username}, secret, {expiresIn:'1h'}); return res.status(200).send({message: 'You are now signed in', token: token}); } } return res.status(404).send({ error: 'Invalid username or password: ' + req.body.username }); }); }); 

现在客户端可以更容易地访问令牌,并且可以进一步发送请求。

 // verify module.exports = function (req, res, next) { // this is fine, though I think the standard is that the token should be sent in the Authorization header with the format Bearer {token} var token = req.body.token || req.headers['x-access-token'] || req.query.token; if(!token) { return next(); // this middleware just is responsible for decoding, other middleware checks authorization } else { jwt.verify(token, secret, function(err, decode) { if(err) { return next(); // again, a bad token doesn't necessarily mean anything for some application pages, put the logic elsewhere. } else { req.user = decode; // this will be { username } based on above req.token = token; // generally you don't need it but just in case. next(); } }); } } 

好的,现在进一步的中间件会包含一个req.user,你可以用来检查一个给定的用户是否应该被允许查看资源。 例如:

 function userRequired(req, res, next) { if (!req.user) return res.status(401).send({message: 'You must be logged in to view this page' }); return next(); } 

这可以很好地扩展到其他检查,你可以有各种angular色等等。