gpt4 book ai didi

node.js - 当我使用 Passport.authenticate() 时,标题消失

转载 作者:太空宇宙 更新时间:2023-11-03 22:28:36 24 4
gpt4 key购买 nike

我从node.js、express.js 和passport.js 开始。

我尝试使用passport-jwt。我已成功登录并获取 token ,但当我使用 passport.authenticate() 时, header 消失,我无法检查 token 。

当我不使用 passport.authenticate() 时,我清楚地获得了 header 。

这是涉及passport-jwt身份验证的所有代码(如果我用 token 替换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)
}
})

有人可以帮助我吗?

编辑 1

为每个请求添加 header 的 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)
}

我用 '/notes' 调用 get(path: string)

编辑2

为了快速测试,您可以使用 cURL,而不是使用我的 Angular2 代码:

首先在node.js中的users.js中添加用户,例如:

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

接下来使用 cURL 进行识别(此处在 Windows 上):

curl -H "Content-Type: application/json" -X POST --data "{\"email\":\"user@mail.com\",\"password\":\"user123\"}" http://localhost:3500/signin

在这里您可以获得响应 token 并使用以下命令发送它:

curl -H "Content-Type: application/json,Authorization: theToken" http://localhost:3500/notes

最佳答案

问题已解决,它来自 OPTIONS header 。由于允许使用 OPTIONS header ,第一个 OPTION 请求被发送到 /notes,但我没有定义 OPTIONS 路径,因此我被阻止,并在 之前删除了所有 header >/注释。我只需从 Access-Control-Allow-Methods 中删除 OPTIONS 即可。

关于node.js - 当我使用 Passport.authenticate() 时,标题消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41551154/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com