[英]Passport.js optional authentication
Passport.js是否有可選的身份驗證中間件?
假設我有一條路線, /api/users
。 我想向公眾提供一個用戶列表,但對於經過身份驗證的人員,我想添加更多字段。
目前我只有一個愚蠢的自定義方法做同樣的事情,但我想知道:
粗略地說,我的方法看起來像
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();
});
}
然而,這對我來說似乎是愚蠢的,而且在passport-auth-strategies.js或其他我認為應該存在的auth層中也沒有。 有什么更好的方法呢?
獎勵點告訴我,如果我找到一個令牌但是它無效,我是否正在做正確的事情返回401
這是一個簡單的PoC:
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);
});
它在/api
端點中“手動”調用passport.authenticate
。 這樣,您可以更好地控制如何處理身份驗證錯誤(在您的情況下 - 不應該將其視為錯誤,而是作為限制輸出的方式)。
這是沒有適當身份驗證的輸出:
$ curl 'localhost:3012/api?username=foo&password=wrong'
{"hello":"world"}
以下是:
$ curl 'localhost:3012/api?username=foo&password=bar'
{"hello":"world","secret":"3133753CR37"}
要用作中間件:
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);
});
現在可能會遲到,但是有一個anonymous
Passport策略允許這一點。 這樣,公共路由可以是否進行身份驗證,但是當它們執行時,您仍將擁有與經過身份驗證的用戶相關聯的所有信息。 在這里查看: https : //github.com/jaredhanson/passport-anonymous
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.