2013-12-08 36 views
0

我在服务器端使用Node.js和Passportjs的组合,在客户端使用Emberjs的应用程序。我目前的身份验证策略是使用Passport-Local以标准电子邮件/密码组合的身份对用户进行身份验证,然后挂接会话创建机制以生成身份验证令牌,将其保存到单独的表中并传回给用户用于任何进一步受保护的路线。 (在REST头中传递)。Nodejs - 是否需要解码身份验证令牌?

令牌的创建是好的,我这样做没有问题,但是如果我需要一个额外的步骤,我正努力工作。

目前,我通过使用一个随机node-uuid通过作为有效载荷,并且用户UID(另一个node-uuid)作为秘密生成与node-jwt-simple令牌。然后,我将其保存到客户端上的$.cookie以及服务器侧的表格以及创建日期。

显然,node-jwt-simple中的其中一个步骤是对令牌进行编码。还提供了解码功能。我的问题是,当我正在进行身份验证检查时,是否需要将令牌解码为某些内容,或者只是检查用户的会话Cookie(REST标头)是否与数据库中的令牌匹配足够?我不想为了生成一个令牌而付出所有的努力,只是为了错过一个重要的步骤,但我没有看到我怎么能够将它解码成任何可以提供任何额外的有用安全性的东西。

UPDATE:

我觉得我的工作了这一点,昨晚:

的解决方案似乎是使用用户的UID作为有效载荷的智威汤逊,用静态的字符串作为秘密(摄来自类似服务器环境变量或类似的东西),然后仅将编码的令牌存储在数据库中。将令牌传递给客户端以进行重新认证,然后当客户端尝试访问受保护的路由时,他们必须将其UID与编码的令牌一起传递给服务器,服务器随后将其解码,并将解码后的净荷与UID已通过。如果它们匹配,则认证成功,否则令牌被破坏,用户必须再次登录。 通过这样做,它使令牌的存储在没有知道密钥或具有用户的UID的情况下实际上无用,但使认证过程更加安全。

回答

1

如果您不验证令牌,那么您还可以创建一些其他随机数据作为会话cookie使用,只要它是唯一的并且不能被客户端猜出。

但是,由于您已经付出了很多努力,您可以在令牌中编码一些有用的内容,告诉您该令牌有效的时间,例如,一个exp字段,所以你不必从数据库中读取数据。

我不确定我是否完全理解您的JWT,但是我看到的问题是您需要信息来解码可能不在您手边的令牌。所以你必须在你的数据库中进行搜索。

我认为使用一些随机会话密钥就足够了,下面的函数:

var crypto = require('crypto'); 

/** 
* Create random bytes and encode base64url. 
* @param {int} [lengthInBytes=40] the size of the raw token in bytes 
*  (will be longer since base64url-encoded) 
* @param {function} callback node-style callback-function; 
*  data-parameter is a string w/ a shortened (no trailing ==) 
*  base64url-encoded string of the generated bytes. 
*/ 
exports.createRandomToken = function createRandomToken(lengthInBytes, callback) { 
    if (typeof lengthInBytes === 'function') { 
     callback = lengthInBytes; 
     lengthInBytes = 40; 
    } 
    crypto.randomBytes(lengthInBytes, function (ex, buf) { 
     if (ex) { 
      callback(ex); 
      return; 
     } 
     callback(null, buf.toString('base64') 
          .replace(/\//g, '_') 
          .replace(/\+/g, '-') 
          .replace(/=/g, '')); 
    }); 
}; 
+0

认为我解决了它(为什么解码会很有用):如果我将用户的UID编码到令牌中(作为有效负载,在服务器端使用一些秘密但静态的字符串),那么在每次Auth请求时将UID和令牌一起传递给服务器,然后服务器可以解码令牌并根据UID检查有效载荷。如果它们匹配则认证失败,否则服务器将销毁令牌,并且必须重新登录。这样可以防止令牌在被服务器窃取时使用,并且如果客户端的cookies被劫持,只会留下安全漏洞,可以通过HTTPS解决。 –

0
  1. 设置到期令牌尽可能小(5分钟,30分钟,也不月既不年)的时间。
  2. 每次更新旧令牌时(使用者无法登录时),使用刷新令牌可以获取新令牌并更新刷新令牌
  3. 不要在令牌中存储密码,信用卡号和任何机密信息(我是舒尔,你知道它:))
  4. 存储检查权限(或检查ip,例如)的所有必要信息。这对REST API和水平缩放非常有用。