Я начинаю с node.js, express.js и passport.js.Заголовки исчезают, когда я использую passeport.authenticate()
Я стараюсь использовать паспорт-jwt. Мне удалось войти и получить мой токен, но когда я использую passport.authenticate()
, заголовки исчезают, и я не могу проверить токен.
Я четко получаю заголовки, когда не использую passport.authenticate()
.
Это весь код, к которым относятся аутентификация паспорт-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)
}
})
Кто-то может мне помочь, пожалуйста?
EDIT 1
Angular2 код, который добавить заголовки для каждого запроса (чтобы не загрязнять с ненужным кодом я просто добавить ГЕТ часть, остальные части не используется для запроса, что я стараюсь):
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, для быстрого тестирования вы можете использовать Curl:
Сначала добавить пользователя в users.js в Node.js, например:
var users = [{
id: 1,
name: "user",
email: "[email protected]",
password: "user123"
}]
module.exports = users
Следующая идентифицироваться с CURL (здесь на окнах):
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) и посмотрите, работает ли он. –