【问题标题】:ExpressJS - JWT and Passport ImplementationExpressJS - JWT 和 Passport 实现
【发布时间】:2018-03-08 23:40:57
【问题描述】:

我目前正在尝试学习 JWT 和 Passport for ExpressJS,但我似乎无法理解 Passport 的工作原理。

这是我最初在我的 ExpressJS 应用程序中所做的。

/api/loginPOSTAPI

  • 接受用户名和密码
  • /api/login 然后创建一个以用户名和密码作为有效负载的 JWT
  • 令牌然后响应客户端

我认为我的/api/login API 模拟了 JWT 硬身份验证一次并以令牌响应的一般思想。

另一方面,/api/test GET API

  • 只有经过身份验证的用户才能访问
  • 只返回“Hello World!”

有什么问题/s?

  • 我的代码似乎没有验证令牌(我尝试将令牌放在 Authenticate 标头中。
  • /api/test 请求时,我应该在我的请求中的哪个位置包含从/api/login 返回的令牌?

现在是我的实际代码:

app.js

var express = require("express");
var bodyParser = require("body-parser");
var jwt = require("jsonwebtoken");
var passport = require("passport");
var LocalStrategy = require('passport-local').Strategy;
var mySecret = "mySecret";
var app = express();
var port = process.env.PORT || 3000;

app.use(bodyParser.json());

passport.use(new LocalStrategy(
    function (token, done) {
        var credentials = jwt.verify(token, mySecret);
        if (credentials.username == "test" && credentials.password == "test") {
            return done(null, credentials);
        } else {
            return done(null, false);
        }
    }
));

app.use(passport.initialize());

app.post("/api/login", function (request, response) {
    var user = {
        "username": request.body.username,
        "password": request.body.password
    };
    response.send(jwt.sign(user, "mySecret"));
});

app.get("/api/test", passport.authenticate("local", {
    "session": false
}), function (request, response) {
    response.send("Hello World!");
});

app.listen(port, function () {
    console.log("Listening on port: " + port);
});

【问题讨论】:

    标签: express authentication token jwt passport.js


    【解决方案1】:

    您还需要配置 jwtStratagy 来对用户进行身份验证。 这是工作示例:-

    const express = require("express");
    const bodyParser = require("body-parser");
    const jwt = require("jsonwebtoken");
    console.log(jwt.verify);
    const passport = require("passport"),
      LocalStrategy = require("passport-local").Strategy;
    const cors = require("cors");
    const app = express();
    app.use(cors());
    app.use(bodyParser.json());
    app.use(passport.initialize());
    var secret = '11210646';
    var JwtStrategy = require('passport-jwt').Strategy,
      ExtractJwt = require('passport-jwt').ExtractJwt;
    passport.use(new LocalStrategy({
        usernameField: 'username',
        passwordField: 'password',
        passReqToCallback: true
      },
      function(req, username, password, done) {
        console.log('ohh', username, password);
        let err = null;
        if (err) { return done(err); }
        if (username != 'abhi') {
          return done(null, false, { message: 'Incorrect username.' });
        }
        if (password != 'pass') {
          return done(null, false, { message: 'Incorrect password.' });
        }
        return done(null, username);
    
      }
    ));
    app.post('/login', function(req, res, next) {
      passport.authenticate('local', function(err, user, info) {
        console.log(err, user, info);
        if (err) { return next(err); }
        if (!user) { res.send({ "status": info.message }); }
        res.send({ "status": user });
      })(req, res, next);
    });
    var opts = {
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      secretOrKey: secret,
      issuer: 'jonu',
      audience: 'jonu bhai',
      passReqToCallback: false
    };
    app.post('/me2', function(req, res, next) {
      passport.authenticate('jwt', { session: false }, function(err,user, info) {
        if (err) { return next(err); }
        if (!user) { res.send({ "status": info.message }); }
        res.send({ "status": user });
      })(req, res, next);
    
    });
    //jwt
    
    passport.use(new JwtStrategy(opts, function(jwt_payload, done) {
      let err = null;
      if (err) {
        return done(err, false);
      }
      if (jwt_payload) {
        return done(null, jwt_payload);
      }
      else {
        return done(null, false);
        // or you could create a new account
      }
    
    }));
    
    
    app.post('/signup', (req, res) => {
    
      let token = jwt.sign({
          user: {
            id: "idididid",
            name: "Abhishek Singh",
            username: "abhishek11210646"
          }
        },
        secret, {
          algorithm: 'HS256',
          expiresIn: '5h',
          issuer: 'jonu',
          audience: 'jonu bhai'
        });
      res.send({ "token": token });
    });
    
    app.get('/', (req, res) => {
      res.send({ "status": "Up and Running..." });
    });
    
    app.listen(8080, () => {
      console.log('server running');
    });
    

    【讨论】:

    • 嘿@Abhishek,我在使用 jwtStrategy 后让它工作了。只是为了补充您的答案,我目前正在使用 ExtractJWT.fromAuthHeaderWithScheme("jwt") 作为我的提取器。实现相同的提取器将需要客户端在令牌之前连接“jwt”。谢谢@Abhishek!
    猜你喜欢
    • 2017-07-25
    • 2020-11-10
    • 1970-01-01
    • 2021-01-10
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    相关资源
    最近更新 更多