我以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
你可以发布你的客户端代码吗?你在哪里发送请求到'/ notes'? –
我用相关的客户端代码编辑。是的,我将请求发送到'/ notes'。感谢您的编辑和回复。 – fleau
我试过你的服务器代码,我用jQuery发送请求,它工作正常,所以我猜这个问题是与客户端代码。基于[this](https://www.w3.org/Protocols/rfc2616/rfc2616.html),头文件区分大小写,所以我建议使用'token = req.headers.Authorization'(大写A ),看看它是否有效。 –