当我使用passeport.authenticate()时,标题消失

我从node.js,express.js和passport.js开始。

我尝试使用passport-jwt。 我已经成功logging并获取我的令牌,但是当我使用passport.authenticate() ,标题消失,我无法检查令牌。

当我不使用passport.authenticate()时,我清楚地得到标题。

这是关于passport-jwtauthentication的所有代码(如果我用req.header.authorization来代替req.header.authorization ,这个代码可以工作):

 const express = require('express') const app = express() const bodyParser = require('body-parser') const users = require("./users.js") const jwt = require("jsonwebtoken") const passport = require("passport") const http = require("http") const notes = require('./notes') const passportJWT = require("passport-jwt") const ExtractJwt = passportJWT.ExtractJwt const JwtStrategy = passportJWT.Strategy app.use(bodyParser.json()) app.all('*', function(req, res, next) { res.header('Access-Control-Allow-Origin', '*') res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS') res.header('Access-Control-Allow-Headers', 'Content-type, Authorization') next() }) var opts = {} opts.jwtFromRequest = function(req) { var token = null; token = req.headers.authorization console.log(token) return token } opts.secretOrKey = 'secret' passport.use(new JwtStrategy(opts, function(payload, done) { var user = users[payload.id-1] console.log(user) if (user) { return done(null, { id: user.id }) } else { return done(new Error("User not found"), null); } })) app.use(passport.initialize()) app.use(passport.session()) app.use('/notes', passport.authenticate('jwt', { session: false }), notes) app.post("/signin", function(req, res) { if (req.body.email && req.body.password) { var email = req.body.email var password = req.body.password var user = users.find(function(u) { return u.email === email && u.password === password; }) if (user) { var token = jwt.sign({ id: user.id }, 'secret', { expiresIn: 60 * 60 }) res.json({ token: token }) } else { res.sendStatus(401) } } else { res.sendStatus(401) } }) 

有人可以帮我吗?

编辑1

Angular2代码为每个请求添加标题(为了不污染不必要的代码,我只是添加get部分,其他部分不用于我尝试的请求):

  apiUrl: string = 'http://localhost:3500' constructor(private http: Http) {} headers: Headers = new Headers ({ 'Content-type': 'application/json', Accept: 'application/json', }) get(path: string): Observable<any> { this.headers.append('Authorization', window.localStorage.getItem('token')) console.log(this.headers) return this.http.get(`${this.apiUrl}${path}`, { headers: this.headers}) .map(this.checkForError) .catch(err => Observable.throw(err)) .map(this.getJson) } 

我用'/notes'调用get(path: string)

编辑2

而不是使用我的Angular2代码,为了快速testing,你可以使用cURL:

首先在node.js的users.js中添加一个用户,例如:

 var users = [{ id: 1, name: "user", email: "user@mail.com", password: "user123" }] module.exports = users 

接下来用cURL标识(这里是windows):

 curl -H "Content-Type: application/json" -X POST --data "{\"email\":\"user@mail.com\",\"password\":\"user123\"}" http://localhost:3500/signin 

在这里,你得到了回应令牌,并发送给你:

 curl -H "Content-Type: application/json,Authorization: theToken" http://localhost:3500/notes 

问题解决了,它来自OPTIONS标题。 由于OPTIONS标头被允许,第一个OPTION请求被发送到/notes但是我没有定义一个OPTIONSpath,所以我是在/notes之前删除所有标题的块。 我只需要从Access-Control-Allow-Methods中删除OPTIONS ,它的工作原理。