作为匿名用户进行身份验证
Authentication as an anonymous user
我想重现 plunker 如何管理 匿名 帐户。
Plunker 可以识别匿名用户。例如,我们可以将一个 plunker 保存为 anonym
,然后将其保存为 freeze
。结果,
只有同一用户(在清除浏览器历史记录之前)才能完全访问此插件(例如,保存修改、解冻)。
如果同一用户在另一个浏览器中打开它或其他用户打开相同的link,他们不能save
任何修改;他们必须 fork
它。
在我的网站中,我使用 passport.js
的 local
策略来管理命名用户。例如,
router.post('/login', function (req, res, next) {
if (!req.body.username || !req.body.password)
return res.status(400).json({ message: 'Please fill out all fields' });
passport.authenticate('local', function (err, user, info) {
if (err) return next(err);
if (user) res.json({ token: user.generateJWT() });
else return res.status(401).json(info);
})(req, res, next);
});
并且我使用 localStorage
来存储令牌。例如,
auth.logIn = function (user) {
return $http.post('/login', user).success(function (token) {
$window.localStorage['account-token'] = token;
})
};
auth.logOut = function () {
$window.localStorage.removeItem('account-token');
};
有谁知道 passport.js
是否有任何策略或现有工具来管理匿名帐户,就像 plunker 所做的那样?否则,有没有传统的方法来实现这个?
Passport 允许匿名身份验证。同样有护照匿名攻略:
app.get('/',
// Authenticate using HTTP Basic credentials, with session support disabled,
// and allow anonymous requests.
passport.authenticate(['basic', 'anonymous'], { session: false }),
function(req, res){
if (req.user) {
res.json({ username: req.user.username, email: req.user.email });
} else {
res.json({ anonymous: true });
}
});
这会使用您的基本策略,如果您使用的是本地身份验证,则可以将其替换为本地策略。如果没有提供任何内容,它会回退到匿名策略,如下所示:
passport.use(new BasicStrategy({
},
function(username, password, done) {
// asynchronous verification, for effect...
process.nextTick(function () {
// Find the user by username. If there is no user with the given
// username, or the password is not correct, set the user to `false` to
// indicate failure. Otherwise, return the authenticated `user`.
findByUsername(username, function(err, user) {
if (err) { return done(err); }
if (!user) { return done(null, false); }
if (user.password != password) { return done(null, false); }
return done(null, user);
})
});
}
));
// Use the BasicStrategy within Passport.
// This is used as a fallback in requests that prefer authentication, but
// support unauthenticated clients.
passport.use(new AnonymousStrategy());
完整示例可在此处找到:- https://github.com/jaredhanson/passport-anonymous/blob/master/examples/basic/app.js
记住,具有较长有效期的 cookie 是识别匿名用户的方式。这与任何尝试通过用户名和密码对用户进行身份验证然后为 http 请求设置 cookie 的服务器端技术的方式相同。
我想重现 plunker 如何管理 匿名 帐户。
Plunker 可以识别匿名用户。例如,我们可以将一个 plunker 保存为 anonym
,然后将其保存为 freeze
。结果,
只有同一用户(在清除浏览器历史记录之前)才能完全访问此插件(例如,保存修改、解冻)。
如果同一用户在另一个浏览器中打开它或其他用户打开相同的link,他们不能
save
任何修改;他们必须fork
它。
在我的网站中,我使用 passport.js
的 local
策略来管理命名用户。例如,
router.post('/login', function (req, res, next) {
if (!req.body.username || !req.body.password)
return res.status(400).json({ message: 'Please fill out all fields' });
passport.authenticate('local', function (err, user, info) {
if (err) return next(err);
if (user) res.json({ token: user.generateJWT() });
else return res.status(401).json(info);
})(req, res, next);
});
并且我使用 localStorage
来存储令牌。例如,
auth.logIn = function (user) {
return $http.post('/login', user).success(function (token) {
$window.localStorage['account-token'] = token;
})
};
auth.logOut = function () {
$window.localStorage.removeItem('account-token');
};
有谁知道 passport.js
是否有任何策略或现有工具来管理匿名帐户,就像 plunker 所做的那样?否则,有没有传统的方法来实现这个?
Passport 允许匿名身份验证。同样有护照匿名攻略:
app.get('/',
// Authenticate using HTTP Basic credentials, with session support disabled,
// and allow anonymous requests.
passport.authenticate(['basic', 'anonymous'], { session: false }),
function(req, res){
if (req.user) {
res.json({ username: req.user.username, email: req.user.email });
} else {
res.json({ anonymous: true });
}
});
这会使用您的基本策略,如果您使用的是本地身份验证,则可以将其替换为本地策略。如果没有提供任何内容,它会回退到匿名策略,如下所示:
passport.use(new BasicStrategy({
},
function(username, password, done) {
// asynchronous verification, for effect...
process.nextTick(function () {
// Find the user by username. If there is no user with the given
// username, or the password is not correct, set the user to `false` to
// indicate failure. Otherwise, return the authenticated `user`.
findByUsername(username, function(err, user) {
if (err) { return done(err); }
if (!user) { return done(null, false); }
if (user.password != password) { return done(null, false); }
return done(null, user);
})
});
}
));
// Use the BasicStrategy within Passport.
// This is used as a fallback in requests that prefer authentication, but
// support unauthenticated clients.
passport.use(new AnonymousStrategy());
完整示例可在此处找到:- https://github.com/jaredhanson/passport-anonymous/blob/master/examples/basic/app.js
记住,具有较长有效期的 cookie 是识别匿名用户的方式。这与任何尝试通过用户名和密码对用户进行身份验证然后为 http 请求设置 cookie 的服务器端技术的方式相同。