删除Meteor认证的登录令牌

5

我不确定之前是否有人问过,但是loginTokens越来越大,没有任何清理就会使我的数据库增加大小。对此有什么解决方法?其他人又是如何处理这个问题的?我指的是默认的Meteor.users.services,其中有一个登录/注销时创建的loginTokens数组。

"resume" : {
        "loginTokens" : [
            {
                "token" : "HMntXepqzPBLDGkGX",
                "when" : 1372559065392
            },
            {
                "token" : "uCHqA95HZZyN5tRtH",
                "when" : 1372563545565
            },
            {
                "token" : "sNGZhhATTrTg8582w",
                "when" : 1372622561176
            },
            {
                "token" : "hPWpm4uQQXWrkK6NS",
                "when" : 1372634411432
            },
            {
                "token" : "DFntTEcsKKT6bJ3rx",
                "when" : 1372635411745
            },
            {
                "token" : "BBM3acLQhuNtsHvkn",
                "when" : 1372638979158
            },
            {
                "token" : "EHgLLHMh6JWxKfuoe",
                "when" : 1372825386462
            }
        ]
    }
3个回答

3

这个问题在 Meteor 的谷歌讨论组中已经被提到了多次,但它并不是一个高优先级的问题。在我的认证系统中,每当用户登录时,我会删除一天以上的令牌。这可以确保如果用户很长时间没有登录,令牌不会过期。

Accounts.registerLoginHandler (loginRequest) ->

  # ... Do whatever you need to do to authenticate the user

  stampedToken = Accounts._generateStampedLoginToken();
  Meteor.users.update userId,
    $push: {'services.resume.loginTokens': stampedToken}

  # Delete old resume tokens so they don't clog up the db
  cutoff = +(new Date) - (24*60*60)*1000
  Meteor.users.update userId, {
    $pull:
      'services.resume.loginTokens':
        when: {$lt: cutoff}
  },
  {multi : true}

  return {
    id: userId,
    token: stampedToken.token
  }

你是否在这个文件 https://github.com/meteor/meteor/blob/master/packages/accounts-base/accounts_server.js/// 中覆盖了 registerLoginHandler 方法?如果是的话,你是在何时/何处进行的(Meteor.startup client/server)? - Warz
不,我没有覆盖它,我在调用它。(这是Coffeescript,请尝试http://js2coffee.org查看相应的Javascript代码。)上面的代码片段定义了一个新的登录处理程序,因此您可以将其拉入您正在使用的任何身份验证系统中。 - Andrew Mao

2

0
我使用Meteor和Vue,我通过以下方式修复了它:
Accounts.validateLoginAttempt((loginAttempt) => {
if (loginAttempt.allowed && loginAttempt.user.services.resume?.loginTokens?.length > 0) {
    const loginTokensOfUser = loginAttempt.user.services.resume.loginTokens;
        Meteor.users.update(loginAttempt.user._id, {
            $set: {
              'services.resume.loginTokens': [loginTokensOfUser.pop()]
            }
        });
    return true;
}
});

这段代码必须在服务器端运行。 已测试通过: Meteor 1.10.2 Vue 2.6.11


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接