J'essaye de sécuriser mes API en utilisant express-jwt. J'utilise la pile MEAN (Angular 4). J'ai essayé plusieurs variantes du code ci-dessous et je n'arrive pas à comprendre pourquoi je ne peux pas valider un jeton.Impossible de valider le jeton côté serveur en utilisant express-jwt avec la pile MEAN
Le code répertorié ci-dessous renvoie un 401 Unauthorized to the client
. Les autres variantes renvoient UnauthorizedError: Format is Authorization: Bearer [token]
. Est-ce que quelqu'un voit quelque chose de mal avec le code ci-dessous?
serveur Code Side
Dans mon fichier app.ts j'ai les suivantes:
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;
}
}));
Questions:
- Est-ce que cet ensemble req.user si le jeton dans la l'en-tête est valide?
- Dois-je appeler getToken() explicitement?
Dans mon fichier routes.ts je:
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);
});
});
Note: Ajout jwt({secret: 'test'}),
après la première ligne dans le code directement au-dessus des rendements UnauthorizedError: Format is Authorization: Bearer [token]
.
Modèle utilisateur:
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;
Gestionnaire d'utilisateur:
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 });
});
});
};
}
Code côté client
Une partie de mon service:
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);
}
Est-ce que cet ensemble req.user si le jeton dans l'en-tête est valide? Réponse: Vous devez définir req.user par userself UnauthorizedError: Format est Autorisation: Bearer [token] Cette erreur est à cause de la ligne suivante dans app.ts retour req.headers.authorization.split (' ')[1]; Vous devez retourner le jeton complet, y compris 'Porteur' – umar