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/login
POST
API
/api/login
然后创建一个以用户名和密码作为有效负载的 JWT
令牌然后响应客户端
我认为我的/api/login
API 模拟了 JWT 硬身份验证一次并以令牌响应的一般思想。
另一方面,/api/test
GET
API
有什么问题/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以上是关于ExpressJS - JWT 和 Passport 实现的主要内容,如果未能解决你的问题,请参考以下文章
使用 Expressjs + JWT + Angularjs 的回调问题
如何使用基于网站的 ExpressJs 设置 CORS 和 JWT 令牌验证