我以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
答案 0 :(得分:0)
问题解决了,它来自OPTIONS
标题。由于允许使用/notes
标头,因此第一个OPTION请求已发送到/notes
,但我没有定义OPTIONS路径,因此我在OPTIONS
之前删除了所有标头。我只需从Access-Control-Allow-Methods中删除when
即可。