ExpressJS - JWT 和 Passport 实现

Posted

技术标签:

【中文标题】ExpressJS - JWT 和 Passport 实现【英文标题】:ExpressJS - JWT and Passport Implementation 【发布时间】: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);
);

【问题讨论】:

【参考方案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!

以上是关于ExpressJS - JWT 和 Passport 实现的主要内容,如果未能解决你的问题,请参考以下文章

使用 Expressjs + JWT + Angularjs 的回调问题

如何使用基于网站的 ExpressJs 设置 CORS 和 JWT 令牌验证

ExpressJS / Angular 2 JWT 令牌

如何从 expressjs 发送 jwt 令牌以响应应用程序? [关闭]

Nuxt auth 与passportjs?

Passport 策略如何知道在 nestJS 中选择正确的 jwt 策略?