身份验证为匿名用户

时间:2017-04-18 19:25:02

标签: authentication login local-storage passport.js angular-local-storage

我想重现plunker如何管理匿名帐户。

Plunker可以识别匿名用户。例如,我们可以将一个plunker保存为anonym,然后保存freeze。结果,

  1. 只有同一个用户(在清除浏览器历史记录之前)才能完全访问此plunker(例如,保存修改,解冻)。

  2. 如果同一个用户在另一个浏览器中打开它或其他用户打开相同的链接,他们就不能save进行任何修改;他们必须fork

  3. 在我的网站中,我使用local passport.js策略来管理命名用户。例如,

    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一样?否则,是否有传统方法来实现这一目标?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

请记住,有效期较长的Cookie是识别匿名用户的方式。这与尝试通过用户名和密码验证用户的任何服务器端技术相同,然后只为http请求设置cookie。