2017-01-09 68 views
2

我以node.js,express.js和passport.js开头。当我使用passeport.authenticate时,标题消失()

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

我明显地得到标题时,我不使用passport.authenticate()

这一切对于涉及到护照,智威汤逊验证代码(如果我更换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) 
    } 
}) 

有人可以帮助我吗?

EDIT 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) 
    } 

而且我打电话get(path: string)'/notes'

EDIT 2

而不是用我的Angular2代码,快速测试,你可以使用卷曲:

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

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

下一页使用卷曲识别(这里在Windows上):

curl -H "Content-Type: application/json" -X POST --data "{\"email\":\"[email protected]\",\"password\":\"user123\"}" http://localhost:3500/signin 

在这里,你得到的响应令牌和你发送:

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

你可以发布你的客户端代码吗?你在哪里发送请求到'/ notes'? –

+0

我用相关的客户端代码编辑。是的,我将请求发送到'/ notes'。感谢您的编辑和回复。 – fleau

+0

我试过你的服务器代码,我用jQuery发送请求,它工作正常,所以我猜这个问题是与客户端代码。基于[this](https://www.w3.org/Protocols/rfc2616/rfc2616.html),头文件区分大小写,所以我建议使用'token = req.headers.Authorization'(大写A ),看看它是否有效。 –

回答

0

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