หนังสือเดินทางท้องถิ่นด้วย node-jwt-simple


87

ฉันจะรวมพาสปอร์ต - ท้องถิ่นเพื่อคืนโทเค็น JWT ในการพิสูจน์ตัวตนสำเร็จได้อย่างไร

ฉันต้องการใช้node-jwt-simpleและดูที่passport.jsฉันไม่แน่ใจว่าจะดำเนินการอย่างไร

var passport = require('passport')
  , LocalStrategy = require('passport-local').Strategy;

passport.use(new LocalStrategy(
  function(username, password, done) {
    User.findOne({ username: username }, function(err, user) {
      if (err) { return done(err); }
      if (!user) {
        return done(null, false, { message: 'Incorrect username.' });
      }
      if (!user.validPassword(password)) {
        return done(null, false, { message: 'Incorrect password.' });
      }
      return done(null, user);
    });
  }
));

เป็นไปได้ไหมที่จะคืนโทเค็นเมื่อโทรเสร็จ ()? อะไรทำนองนี้ ... (แค่รหัสหลอก)

if(User.validCredentials(username, password)) {
  var token = jwt.encode({username: username}, tokenSecret);
  done(null, {token : token}); //is this possible?
}

ถ้าไม่ฉันจะคืนโทเค็นได้อย่างไร

คำตอบ:


123

ฉันคิดออกแล้ว!

ก่อนอื่นคุณต้องใช้กลยุทธ์ที่ถูกต้อง ในกรณีของฉัน LocalStrategy และคุณต้องระบุตรรกะการตรวจสอบของคุณ ตัวอย่างเช่นลองใช้หนึ่งในหนังสือเดินทางท้องถิ่น

var passport = require('passport')
  , LocalStrategy = require('passport-local').Strategy;

passport.use(new LocalStrategy(
  function(username, password, done) {
    User.findOne({ username: username }, function(err, user) {
      if (err) { return done(err); }
      if (!user) {
        return done(null, false, { message: 'Incorrect username.' });
      }
      if (!user.validPassword(password)) {
        return done(null, false, { message: 'Incorrect password.' });
      }
      return done(null, user);
    });
  }
));

การยืนยันการโทรกลับที่คุณให้ไว้function(username, password, done)จะดูแลการค้นหาผู้ใช้ของคุณและตรวจสอบว่ารหัสผ่านตรงกันหรือไม่ (เกินขอบเขตของคำถามและคำตอบของฉัน)

passport.js คาดว่าจะใช้งานได้หลายชิ้นส่วนหนึ่งคือคุณส่งคืนผู้ใช้ในกลยุทธ์ ฉันพยายามเปลี่ยนส่วนนั้นของโค้ดและนั่นผิด การติดต่อกลับคาดว่าfalseหากการตรวจสอบความถูกต้องล้มเหลวและobject(ผู้ใช้ที่ผ่านการตรวจสอบแล้ว) หากคุณทำสำเร็จ

ทีนี้ .... จะรวม JWT ได้อย่างไร?

ในเส้นทางการเข้าสู่ระบบของคุณคุณจะต้องจัดการกับการรับรองความถูกต้องสำเร็จหรือไม่สำเร็จ และที่นี่คุณต้องเพิ่มการสร้างโทเค็น JWT ชอบมาก:

(อย่าลืมปิดการใช้งานเซสชันมิฉะนั้นคุณจะต้องใช้ฟังก์ชัน serialize และ deserialize และคุณไม่จำเป็นต้องใช้สิ่งเหล่านี้หากคุณยังไม่คงเซสชันซึ่งคุณจะไม่อยู่หากคุณใช้โทเค็นรับรองความถูกต้อง)

จากตัวอย่างหนังสือเดินทาง - ท้องถิ่น: (โดยเพิ่มโทเค็น JWT)

// POST /login
//   This is an alternative implementation that uses a custom callback to
//   achieve the same functionality.
app.post('/login', function(req, res, next) {
  passport.authenticate('local', function(err, user, info) {
    if (err) { return next(err) }
    if (!user) {
      return res.json(401, { error: 'message' });
    }

    //user has authenticated correctly thus we create a JWT token 
    var token = jwt.encode({ username: 'somedata'}, tokenSecret);
    res.json({ token : token });

  })(req, res, next);
});

และนั่นมัน! ตอนนี้เมื่อคุณโทร / เข้าสู่ระบบและ POST ชื่อผู้ใช้และรหัสผ่าน (ซึ่งควรอยู่บน SSL เสมอ) ข้อมูลโค้ดแรกด้านบนจะพยายามค้นหาผู้ใช้ตามชื่อผู้ใช้ที่คุณระบุจากนั้นตรวจสอบว่ารหัสผ่านตรงกัน (แน่นอนคุณจะต้อง เปลี่ยนตามความต้องการของคุณ)

หลังจากนั้นจะมีการเรียกเส้นทางการเข้าสู่ระบบของคุณและคุณสามารถดูแลการส่งคืนข้อผิดพลาดหรือโทเค็นที่ถูกต้องได้

หวังว่านี่จะช่วยใครบางคนได้ และหากฉันทำผิดพลาดหรือลืมบางสิ่งบางอย่างโปรดแจ้งให้เราทราบ


3
BasicStrategyหรือDigestStrategyของ Passport เป็นอีกสองตัวเลือก ดูเหมือนว่าจะไม่มีความแตกต่างอย่างมากระหว่างกลยุทธ์พื้นฐานและกลยุทธ์ในพื้นที่เนื่องจากไม่จำเป็นต้องมีเซสชันในการทำงานเพียงแค่นั้น Local จะขอ URL การเปลี่ยนเส้นทาง (ทำให้เป็นมิตรกับ API น้อยกว่าเล็กน้อย)
funseiki

1
เฮ้ @cgiacomi ช่วยยกตัวอย่างเส้นทางที่ตรวจสอบโทเค็นได้ไหม
Matt Kim

3
เฮ้ @ แมตต์ - คิมจริง ๆ แล้วฉันไม่ได้บันทึกโทเค็นมันชั่วคราว ฉันไม่รู้ว่าเป็นวิธีที่ดีที่สุดหรือไม่ แต่นี่คือสิ่งที่ฉันทำ: ผู้ใช้ตรวจสอบสิทธิ์และฉันสร้างโทเค็นและส่งคืนให้กับไคลเอ็นต์ โทเค็นจะถูกเก็บไว้ใน localStorage หากไคลเอนต์เป็นเว็บไซต์หรือคุณสามารถจัดเก็บไว้ในแอป iPhone / Android เมื่อไคลเอ็นต์ต้องร้องขอทรัพยากรระบบจะส่งโทเค็นที่บันทึกไว้ไปยังแบ็กเอนด์ หนังสือเดินทางจะจัดการโทเค็น นี่คือสาระสำคัญของกลยุทธ์ Bearer เพื่อจัดการโทเค็น gist.github.com/cgiacomi/cd1efa187b8cccbe2a61 หวังว่านี่จะช่วยได้! :)
cgiacomi

1
เฮ้ @cgiacomi! อาจจะชัดเจน แต่คุณสามารถอธิบายวิธีปิดเซสชันเมื่อใช้การโทรกลับที่กำหนดเองได้หรือไม่?
MrMuh

2
@MrMuh ชำระเงินลิงก์gist.github.com/cgiacomi/cd1efa187b8cccbe2a61ในความคิดเห็นของฉันฉันแสดงวิธีปิดเซสชัน: passport.authenticate ('bearer', {session: false})
cgiacomi

18

นี่เป็นทางออกที่ดีฉันแค่ต้องการเพิ่มสิ่งนี้:

var expressJwt = require('express-jwt');

app.use('/api', expressJwt({secret: secret}));

ฉันชอบใช้"express-jwt"เพื่อตรวจสอบโทเค็น

btw: บทความนี้ดีมากในการเรียนรู้วิธีจัดการโทเค็นในฝั่งไคลเอ็นต์โดยใช้ Angular เพื่อส่งกลับไปพร้อมกับทุกคำขอ

https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/


2
ผมเคยใช้เท่านั้นexpress-jwtที่จะทำการตรวจสอบ แต่อ่านผ่านเอกสารของแพคเกจอื่น ๆ เช่นผมคิดว่าผมจะได้รับการติดpassport-jwt express-jwtIMO ที่เรียบง่ายและดีกว่ามาก
bobbyz

เพียงแค่ FYI express-jwt ไม่ได้ให้การสนับสนุนโทเค็นการรีเฟรช
user3344977

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.