【问题标题】:Error : 401 (Unauthorized) , Passport Authenticate in Node错误:401(未经授权),Passport Authenticate in Node
【发布时间】:2017-10-07 17:24:38
【问题描述】:

这里使用护照身份验证中间件,从登录 api 我生成了一个 jwt 令牌,它在标题中发送到 API http://localhost:3030/home/ 但它的抛出

错误

angular.js:12587 POST http://localhost:3030/home/ 401(未授权)。

angular.js:14525 可能未处理的拒绝:{"data":"Unauthorized","status":401,"config":{"method":"POST","transformRequest":[null],"transformResponse ":[null],"jsonpCallbackParam":"callback","url":"http://localhost:3030/home/","headers":{"Accept":"application/json, text/plain, / "}},"statusText":"未授权"}

route.js

module.exports = function(app , passport){
    app.use('/login',userCtrl);
    app.use('/register',registerCtrl);
    app.use('/home', passport.authenticate('jwt', { session: false }) , homerCtrl);
};

passposrt.js

var JwtStrategy = require('passport-jwt').Strategy,
    ExtractJwt = require("passport-jwt").ExtractJwt;
var config = require('./appConfig.js');

module.exports = function(passport){
    var jwtOptions = {}
    jwtOptions.jwtFromRequest = ExtractJwt.fromAuthHeader();
    jwtOptions.secretOrKey = config.secret;
    var strategy = new JwtStrategy(jwtOptions, function(jwt_payload, next) {
        var user = users[_.findIndex(users, {id: jwt_payload.id})];
        if (user) {
            next(null, user);
        } else {
            next(null, false);
        }
    });
    passport.use(strategy); 
}

家庭控制器

var mongoose = require("mongoose");
var User = mongoose.model("user");
var express = require("express");
var jwt = require('jsonwebtoken');
var config = require('./../config/appConfig.js');

//Type 1 using router
var router = express.Router();
router.post('/' , function(req, res, next){
    var formData = req.body;   
    getUserData(formData , function(user){
        res.json({ "responseMessage" : "Home Api Sucess" });
    });
});

function getUserData(formData , cb){
    User.findOne({username : formData.username}).then(function(user){
        cb(user);
    }).catch(function(err){
        cb(err);
    });
}

module.exports = router;

登录控制器

var router = express.Router();
router.post('/' , function(req, res, next){
var formData = req.body; 
var username = req.body.username;
var password = req.body.password;

getUserData(formData , function(user){
    if(user){
        user.verifyPassword(password , function(err, isMatch){
        if(isMatch){
            var token = createToken(user);
            res.json({ "responseMessage" : "Login Sucess" , "token" :token});
        }else{
            res.json({ "responseMessage" : "Login Failed" });   
        }
    })
    }else{
        res.json({ "responseMessage" : "Login Failed" });   
    }
});
});

function createToken(user){
 var payload = {id: user.name};
    var token = jwt.sign(payload, config.secret);
    return "JWT " +token;
}

function getUserData(formData , cb){
    User.findOne({username : formData.username}).then(function(user){
        cb(user);
    }).catch(function(err){
        cb(err);
    });
}

【问题讨论】:

    标签: angularjs node.js authentication jwt passport.js


    【解决方案1】:

    passport.js 中替换

    jwtOptions.jwtFromRequest = ExtractJwt.fromAuthHeader();
    

    jwtOptions.jwtFromRequest = ExtractJwt.fromAuthHeaderWithScheme('JWT');
    

    【讨论】:

      【解决方案2】:

      您必须为每个受保护的路由发送一个授权标头。

      查看使用 Postman 的示例:

      PS:你必须在登录过程中创建一个 JWT 令牌。

      希望对你有帮助。

      【讨论】:

      • JWT 令牌在调用 localhost:3030/home 时在标头中发送。
      • 嗯...在 passport.js 文件中。这行var user = users[_.findIndex(users, {id: jwt_payload.id})]; 是否正确检索用户?因为当您创建令牌时,您会这样做:id = user.username,但您似乎试图通过 user.id 查找。
      猜你喜欢
      • 2022-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-28
      • 2015-04-19
      • 1970-01-01
      • 1970-01-01
      • 2017-04-17
      相关资源
      最近更新 更多