当我使用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
,它的工作原理。