2017-07-10 2 views
0

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:

  1. Est-ce que cet ensemble req.user si le jeton dans la l'en-tête est valide?
  2. 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); 
    } 
+0

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

Répondre

1

côté serveur, vous pouvez le faire comme ce

var authentication = require('./auth'); 
router.route('/create') 
    .all(authentication) 
    .post(function(req, res){ 
     // Your Code 
    }); 

Et En auth.js écriture code suivant

var jwt = require('jwt-simple'), 
    common = require('./common'), 
    secretKey = require('./key'); 

module.exports = function (req, res, next) { 
    var token = req.headers['authorization']; 
    if (token) { 
     try { 
      var token = jwt.decode(token, secretKey); 
      var user = token.user; // Get user from token in your way 
      return next(); 
     } catch (err) { 
      // Throw error 
     } 
    } else { 
     // Throw error 
    } 
}; 
+0

Merci! J'ai fini par utiliser jwt-simple et en suivant cet exemple au lieu de express-jwt – jinan