私は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
クライアント側のコードも投稿できますか?あなたは '/ notes'にリクエストをどこに送りますか? –
関連するクライアント側のコードで編集しました。はい、私は '/ notes'にリクエストを送ります。あなたの編集と対応に感謝します。 – fleau
私はあなたのサーバーコードを試して、私は要求を送信するためにjQueryを使用しました。問題なく動作していたので、問題はクライアントコードであると推測しています。 [this](https://www.w3.org/Protocols/rfc2616/rfc2616.html)に基づいて、ヘッダは大文字と小文字が区別されるので、 'token = req.headers.Authorization'(大文字A )それが動作するかどうかを確認してください。 –