-
-
Save JonathanMH/6bd82c0954fb8f21a837ce281da4265a to your computer and use it in GitHub Desktop.
| // file: index.js | |
| var _ = require("lodash"); | |
| var express = require("express"); | |
| var bodyParser = require("body-parser"); | |
| var jwt = require('jsonwebtoken'); | |
| var passport = require("passport"); | |
| var passportJWT = require("passport-jwt"); | |
| var ExtractJwt = passportJWT.ExtractJwt; | |
| var JwtStrategy = passportJWT.Strategy; | |
| var users = [ | |
| { | |
| id: 1, | |
| name: 'jonathanmh', | |
| password: '%2yx4' | |
| }, | |
| { | |
| id: 2, | |
| name: 'test', | |
| password: 'test' | |
| } | |
| ]; | |
| var jwtOptions = {} | |
| jwtOptions.jwtFromRequest = ExtractJwt.fromAuthHeader(); | |
| jwtOptions.secretOrKey = 'tasmanianDevil'; | |
| var strategy = new JwtStrategy(jwtOptions, function(jwt_payload, next) { | |
| console.log('payload received', jwt_payload); | |
| // usually this would be a database call: | |
| var user = users[_.findIndex(users, {id: jwt_payload.id})]; | |
| if (user) { | |
| next(null, user); | |
| } else { | |
| next(null, false); | |
| } | |
| }); | |
| passport.use(strategy); | |
| var app = express(); | |
| app.use(passport.initialize()); | |
| // parse application/x-www-form-urlencoded | |
| // for easier testing with Postman or plain HTML forms | |
| app.use(bodyParser.urlencoded({ | |
| extended: true | |
| })); | |
| // parse application/json | |
| app.use(bodyParser.json()) | |
| app.get("/", function(req, res) { | |
| res.json({message: "Express is up!"}); | |
| }); | |
| app.post("/login", function(req, res) { | |
| if(req.body.name && req.body.password){ | |
| var name = req.body.name; | |
| var password = req.body.password; | |
| } | |
| // usually this would be a database call: | |
| var user = users[_.findIndex(users, {name: name})]; | |
| if( ! user ){ | |
| res.status(401).json({message:"no such user found"}); | |
| } | |
| if(user.password === req.body.password) { | |
| // from now on we'll identify the user by the id and the id is the only personalized value that goes into our token | |
| var payload = {id: user.id}; | |
| var token = jwt.sign(payload, jwtOptions.secretOrKey); | |
| res.json({message: "ok", token: token}); | |
| } else { | |
| res.status(401).json({message:"passwords did not match"}); | |
| } | |
| }); | |
| app.get("/secret", passport.authenticate('jwt', { session: false }), function(req, res){ | |
| res.json({message: "Success! You can not see this without a token"}); | |
| }); | |
| app.get("/secretDebug", | |
| function(req, res, next){ | |
| console.log(req.get('Authorization')); | |
| next(); | |
| }, function(req, res){ | |
| res.json("debugging"); | |
| }); | |
| app.listen(3000, function() { | |
| console.log("Express running"); | |
| }); |
| { | |
| "name": "jwt-tutorial", | |
| "version": "1.0.0", | |
| "description": "", | |
| "main": "index.js", | |
| "scripts": { | |
| "test": "echo \"Error: no test specified\" && exit 1" | |
| }, | |
| "keywords": [], | |
| "author": "", | |
| "license": "ISC", | |
| "dependencies": { | |
| "body-parser": "^1.15.2", | |
| "express": "^4.14.0", | |
| "jsonwebtoken": "^7.1.9", | |
| "lodash": "^4.16.4", | |
| "passport": "^0.3.2", | |
| "passport-jwt": "^2.1.0" | |
| } | |
| } |
Thank you for this sample.
I have a question in regards to this part:
app.get("/secret", passport.authenticate('jwt', { session: false }), function(req, res){
res.json({message: "Success! You can not see this without a token"});
});
when I do the get request I get:
Unauthorized
Do I set a header parameter passing in the token with that get request?
How do I use the generated token with that GET request to get the success message?
Thank, it is that I need! 👍
Great Article!!
developermhayden use fetch polyfill with headers options (https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch)
TypeError: ExtractJwt.fromAuthHeader is not a function
Line 28 needs to change to: jwtOptions.jwtFromRequest = ExtractJwt.fromAuthHeaderWithScheme('jwt'); ?
Reference: https://www.npmjs.com/package/passport-jwt#migrating-from-2xx-to-3xx
Hi,
I have all working now and I'm getting===== > "Success! You can not see this without a token".
I need to continue with my application and adding more options like:
app.post("/read", function(req, res) {
**//
// do all here just when the access is granted, but error if no access or "Unauthorized"
//**
}
What else I need to include?
Thank you all guys.
@developermhayden
prefix token with JWT
example : "JWT token"
@wisetc I used this instead
jwtOptions.jwtFromRequest = ExtractJwt.fromAuthHeaderWithScheme('bearer');
Hello everyone. I still have this issue. Tried using bearer strategy too. Here is the link to my repo https://github.com/soumodips/JWT-passport-OAuth
I will be glad if any one can help.
Thanks a ton in advance!
ISSUE SOLVED:
Be sure to use all key names as expected by the modules. I had used 'exp' for expiry time in the payload instead of 'expiresIn'. Enjoy!!
Thanks
Here, I fixed his code:
https://gist.github.com/ianfabs/7d2e8dca8e4e131463b5cdd6a2c537c5
These 2 ways worked for me:
ExtractJwt.fromAuthHeaderWithScheme('bearer') or with ('jwt');
Headers: Authorization: bearer + token or jwt + token
Very helpful! Thanks




Thanks 👍