Câu hỏi Passport.js tùy chọn xác thực


Có một phần mềm trung gian xác thực tùy chọn từ Passport.js không?

Giả sử tôi có lộ trình, /api/users. Tôi chỉ muốn cung cấp danh sách người dùng cho công chúng, nhưng với những người được xác thực, tôi muốn thêm nhiều trường hơn.

Hiện tại tôi chỉ có một phương thức tùy chỉnh câm, nhưng cũng tự hỏi liệu:

  • Passport.js đã cung cấp những thứ như vậy hoặc
  • làm sao tôi có thể làm điều này phần của hộ chiếu, giống như một plugin hoặc hơn.

Phương pháp của tôi, gần như, trông giống như

function optionalAuth(req, res, next) {

    var authHeader = req.headers.authorization;
    var token = parseToken(authHeader); // just getting the OAuth token here
    if(!token) {

        return next();
    }
    User.findOne({
        token: token
    }, function(err, user) {

        if(err) {
            return res.json(401, {message: 'auth expired'});
        };
        if(user) {
            req.user = user;
        }
        next();
    });
}

Điều này, tuy nhiên, có vẻ câm với tôi, và cũng không phải trong hộ chiếu-auth-strateg.js hoặc một số auth lớp khác mà tôi nghĩ rằng nó nên được. Cách tốt hơn để làm điều đó là gì?

Điểm thưởng cho tôi biết nếu tôi đang làm điều thích hợp trả lại 401 nếu tôi tìm thấy mã thông báo nhưng không hợp lệ :)


10
2017-09-12 10:36


gốc


Giả sử rằng bạn có những điều cơ bản làm việc (xác thực người dùng), tôi nghĩ bạn có thể sử dụng req.isAuthenticated() (đó là một cái gì đó mà Passport xác định) để kiểm tra xem bạn có muốn trả lại các trường bổ sung hay không. - robertklep
Tôi không thể sử dụng req.isAuthenticated vì tôi không thể đặt hộ chiếu.authenticate () trước này. Tại sao? Bởi vì người dùng không được xác thực sẽ bị từ chối. Tôi không có một phiên, đó là một API không trạng thái, chỉ là một mã thông báo mang. Nếu tôi đặt passport.authenticate () trong tuyến đường, một số người dùng sẽ nhận được 401. Tôi muốn họ vượt qua, chỉ nhận được thông tin giới hạn. - Zlatko


Các câu trả lời:


Đây là một PoC đơn giản:

var express       = require('express');
var app           = express();
var server        = app.listen(3012);
var passport      = require('passport');
var LocalStrategy = require('passport-local').Strategy;

app.use(passport.initialize());

passport.use(new LocalStrategy(function(username, password, done) {
  if (username === 'foo' && password === 'bar') {
    return done(null, { username : 'foo' });
  }
  return done(null, false);
}));

app.get('/api', function(req, res, next) {
  passport.authenticate('local', function(err, user, info) {
    var data = { hello : 'world' };
    // Only if the user authenticated properly do we include secret data.
    if (user) {
      data.secret = '3133753CR37';
    }
    return res.send(data);
  })(req, res, next);
});

Nó đang gọi passport.authenticate 'thủ công' trong /api điểm cuối. Bằng cách đó, bạn sẽ có nhiều quyền kiểm soát hơn đối với cách xử lý lỗi xác thực (trong trường hợp này — không nên coi là lỗi nhưng là cách hạn chế đầu ra).

Đây là đầu ra không có xác thực hợp lệ:

$ curl 'localhost:3012/api?username=foo&password=wrong'
{"hello":"world"}

Và đây là:

$ curl 'localhost:3012/api?username=foo&password=bar'
{"hello":"world","secret":"3133753CR37"}

Để sử dụng như một phần mềm trung gian:

var middleware = function(req, res, next) {
  passport.authenticate('local', function(err, user, info) {
    req.authenticated = !! user;
    next();
  })(req, res, next);
};

app.get('/api', middleware, function(req, res, next) {
  var data = { hello : 'world' };
  if (req.authenticated) {
    data.secret = '3133753CR37';
  }
  return res.send(data);
});

11
2017-09-14 10:51



Cảm ơn. Trong một cách nó là tốt hơn sau đó cố gắng của tôi, vì nó sử dụng hộ chiếu cho auth. Nhưng nó hơi vụng về hơn một chút, tôi không thể đặt nó như một phần mềm trung gian trên các tuyến đường không được xác thực. Nhưng điều này có thể được bao bọc thành một số loại plugin. Tôi sẽ phải thử mặc dù. - Zlatko
@Zlatko Tôi đã chỉnh sửa câu trả lời của mình để đưa ra ý tưởng về cách bạn có thể biến nó thành một phần mềm trung gian. - robertklep
Tuyệt vời, đó là nó, tốt hơn sau đó can thiệp của tôi. - Zlatko


Có thể là muộn, nhưng có một anonymous Chiến lược hộ chiếu để cho phép chính xác điều này. Bằng cách đó, các tuyến đường công cộng có thể thực hiện xác thực hoặc không, nhưng khi thực hiện, bạn vẫn sẽ có tất cả thông tin được liên kết với người dùng được xác thực. Kiểm tra nó ra ở đây: https://github.com/jaredhanson/passport-anonymous


9
2018-05-19 19:07



Đó là muộn cho công việc đó, nhưng có thể giúp đỡ những người tương lai :) - Zlatko