Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js身份验证库,带有;持久性令牌“;功能_Javascript_Node.js_Authentication - Fatal编程技术网

Javascript Node.js身份验证库,带有;持久性令牌“;功能

Javascript Node.js身份验证库,带有;持久性令牌“;功能,javascript,node.js,authentication,Javascript,Node.js,Authentication,我有工作方面的知识,但没有以下内容: 生成“持久性令牌”(例如 为密码重置生成易腐令牌 记得我吗 管理这些属性以便在某些模型类上登录/注销,等等 在Node.js社区中是否有任何库已经解决了这个问题?如果有任何库像Node.js社区一样健壮(或者正在变得健壮),那将是完美的,但是解决这个令牌问题的任何库都同样有效 疯狂的事情是,很多例子都是在会话中存储用户id request.session['userId'] = user.get('id') 那只是要求被黑客攻击 应该是这样的: req

我有工作方面的知识,但没有以下内容:

  • 生成“持久性令牌”(例如
  • 为密码重置生成易腐令牌
  • 记得我吗
  • 管理这些属性以便在某些模型类上登录/注销,等等
在Node.js社区中是否有任何库已经解决了这个问题?如果有任何库像Node.js社区一样健壮(或者正在变得健壮),那将是完美的,但是解决这个令牌问题的任何库都同样有效

疯狂的事情是,很多例子都是在会话中存储用户
id

request.session['userId'] = user.get('id')
那只是要求被黑客攻击

应该是这样的:

require.session['persistenceToken'] = App.User.generateRandomToken()
我将实施一次性密码(也称为一次性令牌)策略来重置密码。考虑到Passport的体系结构,这很容易成为一个单独的模块,如果我发现其他人已经实现了这样的功能,我也不会感到惊讶

记住我,持久性令牌功能也是我想要支持的。最好,我也希望这是一个单独的策略,但它可能需要一些核心支持。如果是这样的话,
req.logIn
()中的几行额外内容应该能够涵盖它

至于在会话中存储用户ID,我认为没有什么大的风险,因为默认情况下,在Connect/Express中,会话属性完全存储在后端,并由加密cookie中设置的唯一
sid
查找。恶意用户必须同时拥有唯一sid和会话机密才能伪造请求美国

Mozilla正在使用Passport作为其身份验证工作的一部分,以将BrowserID连接到其他缺少BrowserID支持的提供商(请参阅)。根据他们的要求,开发人员可以确保Passport满足严格的安全要求

(Passport中的会话序列化最终是应用程序的责任,因此出于安全原因,如果需要,可以使用随机令牌代替用户ID。显然,如果将数据直接存储在cookie中,应该这样做,但我认为这样做是最不明智的做法。)

就管理模型上的这些属性而言,Passport的设计完全与模型/ORM无关。我不打算改变这一事实,因为我认为这些决定最好留给应用程序来做(由于委派了这一职责,Passport更加灵活)。也就是说,我认为其他模块在Passport之上独立构建以提供此功能的空间

综上所述,我认为Passport是现有Node.js auth解决方案中最强大的解决方案。您的前三个请求将大大有助于实现这一点,而且它们应该很容易实现。我很愿意合作开发这些功能,因此请随时与我联系


最后,如果有人好奇,一流的API认证目前正在分支机构中进行。在此基础上,实现了OAuth服务器策略,可以与middlware结合作为一个工具包来组装OAuth服务器。这还没有完全成熟,但当Passport准备就绪时,它将是另一个有效的特性。

同时,以下内容应该足够了。根据需要进行调整,以适合您的应用程序和所需的cookie持续时间。检查用户名和密码是检测登录尝试的一种非常简单的方法,但它在passport上也可以很好地工作

app.use(function(req, res, next) {
    if(
            typeof(req.body.username) !== "undefined"
            && typeof(req.body.password) !== "undefined"
            ) {
        if(req.body.remember == 1) {
            req.session.cookie.maxAge = 365*24*60*60*1000;
        }
        else {
            req.session.cookie.maxAge = 24*60*60*1000;
        }
    }
    next();
});

虽然我很想在passport.js中看到这些功能,但它们还没有出现

我创建了一个简单的随机令牌生成器,用于passport.js serilizeUser()函数,并对Justen的答案进行了一些修改,以满足我的需要。基本上,唯一的区别是,如果没有设置“记住”选项,会话将持续到浏览器打开为止

这是我的带有随机访问令牌生成器的序列化程序。我正在使用Mongodb和Mongoose,但是实现应该可以很好地转换到其他系统

基本上,我获取时间并向其添加一个随机的16个字符的字符串。然后,在serializeUser()函数中,我检查是否没有其他用户具有相同的令牌(令牌应该是唯一的!)

…这是我的中间件版本,它处理“记住我”功能。不过,我更希望这是serializeUser函数或passport.js核心的一部分

app.use( express.session( { secret: 'secret_key' } ) );
app.use( function (req, res, next) {
    if ( req.method == 'POST' && req.url == '/login' ) {
      if ( req.body.remember ) {
        req.session.cookie.maxAge = 30*24*60*60*1000; // Rememeber 'me' for 30 days
      } else {
        req.session.cookie.expires = false;
      }
    }
    next();
});
app.use( passport.initialize() );
app.use( passport.session() );

我希望这能有所帮助。我花了几个小时才弄明白,我不太确定这是最好的方法,但现在对我来说很有效。

我想这并不难实现,只是希望它已经存在。我已经制定了一个“记住我”策略:我正在使用带有本地身份验证策略的passport,希望添加“记住我”功能。我可以在serializeUser()中设置cookie生存期吗函数ro我必须破解内核吗?还是其他什么?我想知道为什么在
else
语句中设置
res.session.cookie.maxAge=null;
不起作用?我试过了,如果我登录一次并将“记住我”选项设置为true,那么所有后续登录也会有一个持久的cookie集,即使是“记住我”关闭。我刚刚意识到我应该使用
req.session.cookie.expires=false
来代替,我将发布这个问题的另一个答案。我知道这很旧,但是使用会话中间件在这里有什么帮助?我们能不能跳过它?
passport.serializeUser( function ( user, done ) {

  var createAccessToken = function () {
    var token = user.generateRandomToken();
    app.User.findOne( { accessToken: token }, function (err, existingUser) {
      if (err) return done( err );
      if (existingUser)
        createAccessToken(); // Run the function again - the token has to be unique!
      else {
        user.set( 'accessToken', token );
        user.save( function ( err ) {
          if (err) return done( err );
          return done( null, user.get('accessToken') );
        })
      }
    });
  };

  if ( user._id ) {
    createAccessToken();
  }
});
app.use( express.session( { secret: 'secret_key' } ) );
app.use( function (req, res, next) {
    if ( req.method == 'POST' && req.url == '/login' ) {
      if ( req.body.remember ) {
        req.session.cookie.maxAge = 30*24*60*60*1000; // Rememeber 'me' for 30 days
      } else {
        req.session.cookie.expires = false;
      }
    }
    next();
});
app.use( passport.initialize() );
app.use( passport.session() );