2017-07-10 67 views
0

我试图使用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; 
    } 
    })); 

问题:

  1. 请问这套req.user如果令牌标题是否有效?
  2. 我是否需要明确调用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); 
    } 
+0

请问这套req.user如果头中的令牌是有效的? 答:您需要通过userself设置req.user UnauthorizedError:格式为授权:承载[令牌] 这个错误是因为在app.ts以下行 回报req.headers.authorization.split的( '')[1]; 您必须返回包括'持票人'的整个令牌 – umar

回答

1

在服务器端,你可以做这样的

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

并在auth.js写下面的代码

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

谢谢!我结束了使用jwt-simple并按照这个例子而不是express-jwt – jinan

相关问题