2017-01-09 5 views
2

私はnode.js、express.js、passport.jsから始めています。passeport.authenticate()を使用するとヘッダが消えます

私はpassport-jwtを使用しようとしています。私はログに成功してトークンを取得しましたが、passport.authenticate()を使用すると、ヘッダーが消えてトークンを確認できません。

passport.authenticate()を使用しないと、明らかにヘッダーが表示されます。

これは(私がトークンによってreq.header.authorizationを交換した場合、このコードは動作します)パスポート-JWT認証に関係するすべてのコードです:

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) 
    } 
}) 

誰かが私を助けてくださいだろうか?各要求(私はちょうどGET部分を追加し、不要なコードを汚さないために、他の部分は私がしようと要求するために使用されていない)のためのヘッダを追加

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を使用することができます迅速なテストのために、使用します。

まず例えば、Node.jsの中users.jsにユーザーを追加します。

var users = [{ 
    id: 1, 
    name: "user", 
    email: "[email protected]", 
    password: "user123" 
}] 
module.exports = users 

次は(ここではWindowsの場合)に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の前に削除しました。 Access Control-Allow-MethodsからOPTIONSを削除するだけで動作します。

関連する問題