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

时间:2017-01-09 15:18:39

标签: node.js express passport.js

我以node.js,express.js和passport.js开头。

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

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

这是所有涉及passport-jwt身份验证的代码(如果我用令牌替换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)
  }

我用get(path: string)致电'/notes'

编辑2

不是使用我的Angular2代码,为了快速测试,你可以使用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

1 个答案:

答案 0 :(得分:0)

问题解决了,它来自OPTIONS标题。由于允许使用/notes标头,因此第一个OPTION请求已发送到/notes,但我没有定义OPTIONS路径,因此我在OPTIONS之前删除了所有标头。我只需从Access-Control-Allow-Methods中删除when即可。