2017-01-09 3 views
2

Я начинаю с 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 
+0

Вы также можете опубликовать свой код на стороне клиента? где вы отправляете запрос на '/ notes'? –

+0

Я отредактировал соответствующий код на стороне клиента. Да, я отправляю запрос на '/ notes'. Спасибо за ваше редактирование и ответ. – fleau

+0

Я пробовал ваш код сервера, и я использовал jQuery для отправки запроса, он работал нормально, поэтому я предполагаю, что проблема связана с клиентским кодом. Основываясь на [this] (https://www.w3.org/Protocols/rfc2616/rfc2616.html), заголовки чувствительны к регистру, поэтому я предлагаю использовать 'token = req.headers.Authorization' (капитал A) и посмотрите, работает ли он. –

ответ

0

Проблема решена, она пришла из заголовка OPTIONS. Поскольку заголовок OPTIONS был разрешен, первый запрос OPTION был отправлен на /notes, но я не определял путь OPTIONS, поэтому я был заблокирован со всеми заголовками, удаленными до /notes. Мне просто нужно удалить OPTIONS из Access-Control-Allow-Methods, и он работает.

Смежные вопросы