我试图使用express-jwt来保护我的apis。我正在使用MEAN(Angular 4)堆栈。我已经尝试了以下代码的很多变体,并且无法弄清楚为什么我无法验证令牌。无法使用Express-jwt与MEAN堆栈验证服务器端的令牌
下面列出的代码返回401 Unauthorized to the client
。其他变化返回UnauthorizedError: Format is Authorization: Bearer [token]
。有没有人看到下面的代码有什么问题?
服务器端代码
在我app.ts文件我有以下几点:
app.use('/api/volunteers/', jwt({
secret: 'test',
credentialsRequired: false,
getToken: function fromHeaderOrQuerystring (req) {
if (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer') {
// console.log(req.headers.authorization.split(' ')[0] === 'Bearer')
return req.headers.authorization.split(' ')[1];
} else if (req.query && req.query.token) {
return req.query.token;
}
return null;
}
}));
问题:
- 请问这套req.user如果令牌标题是否有效?
- 我是否需要明确调用getToken()?
在我routes.ts文件我有:
app.get('/api/volunteers',
function(req, res) {
console.log('req user ' + req.user);
// auth
if (!req.user) {
return res.sendStatus(401);
}
// logic
Volunteer.find({}, (err, docs) => {
if (err) {
res.status(400).send(err);
return console.error(err);
}
res.json(docs);
});
});
注:在代码中直接返回上方的UnauthorizedError: Format is Authorization: Bearer [token]
第一行后添加jwt({secret: 'test'}),
。
用户模型:
import * as bcrypt from 'bcryptjs';
import * as mongoose from 'mongoose';
const userSchema = new mongoose.Schema({
username: String,
email: { type: String, unique: true, lowercase: true, trim: true },
password: String,
role: String
});
const User = mongoose.model('User', userSchema);
export default User;
用户处理程序:
import BaseHandler from './base';
import User from '../models/user';
import * as jwt from 'jsonwebtoken';
import * as dotenv from 'dotenv';
import 'zone.js';
import 'reflect-metadata';
export default class UserHandler extends BaseHandler {
model = User;
login = (req, res) => {
this.model.findOne({ email: req.body.email }, (err, user) => {
if (!user) { return res.sendStatus(403); }
user.comparePassword(req.body.password, (error, isMatch) => {
if (!isMatch) { return res.sendStatus(403); }
// why sign with user
// why do I need test
const token = jwt.sign({user: user}, 'test');
res.status(200).json({ token: token });
});
});
};
}
客户端代码
我服务的一个部分:
constructor(private http: Http) {
this.headers = new Headers({ 'Content-Type': 'application/json' });
this.headers.append('authorization', localStorage.token);
this.options = new RequestOptions({ headers: this.headers });
}
getVolunteers(): Observable<Volunteer[]> {
return this.http.get('/api/volunteers', this.options)
.map((res: Response) => res.json())
.catch(handleError);
}
请问这套req.user如果头中的令牌是有效的? 答:您需要通过userself设置req.user UnauthorizedError:格式为授权:承载[令牌] 这个错误是因为在app.ts以下行 回报req.headers.authorization.split的( '')[1]; 您必须返回包括'持票人'的整个令牌 – umar