Express JWT 错误:socket.io 初始身份验证中的段不足或过多

Posted

技术标签:

【中文标题】Express JWT 错误:socket.io 初始身份验证中的段不足或过多【英文标题】:Express JWT Error: Not enough or too many segments in socket.io initial auth 【发布时间】:2015-08-09 23:42:24 【问题描述】:

在传递令牌和用户名的初始握手期间,我遇到了这个奇怪的错误--

     handle: 10,
      type: 'error',
      className: 'Error',
      constructorFunction:  ref: 11 ,
      protoObject:  ref: 12 ,
      prototypeObject:  ref: 3 ,
      properties: 
      [  name: 'stack',
          attributes: 2,
          propertyType: 3,
          ref: 3 ,
         name: 'arguments',
          attributes: 2,
          propertyType: 1,
          ref: 3 ,
         name: 'type',
          attributes: 2,
          propertyType: 1,
          ref: 3 ,
         name: 'message',
          attributes: 2,
          propertyType: 1,
          ref: 13  ],
        text: 'Error: Not enough or too many segments' 

JWT 格式错误?初始令牌格式错误?

【问题讨论】:

你能出示 JWT 吗? 我很难复制此错误,但我怀疑它是在尝试解析空 JWT 后发出的。我不确定发布我的 JWT 是否是一个安全明智的好主意(一切都是加密的,但我对此感觉不太好——为我的开发环境设置了相当宽松的过期时间),但我可以告诉你 JWT 是正确形成和转移,经过检查。 【参考方案1】:

如果你使用的是JWT-simple,通过查看源代码,我们可以看出这个错误是由于token的形式不正确造成的。

//...

var segments = token.split('.');
if (segments.length !== 3) 
  throw new Error('Not enough or too many segments');

【讨论】:

我不同意这些修改。这个token 变量来自哪里?省略号至少表明上面还有其他代码未包含在我的答案中。【参考方案2】:

据我所知,此错误是解析 JWT 时未捕获的异常的结果,该 JWT 引用不再在 db 中的用户 - 更常见的情况是当 bcrypt 比较或您使用的任何东西发现比较哈希为假——我已经考虑到这一点——没有找到我没有找到的用户。当我考虑到这一点时,错误消失了。

【讨论】:

【参考方案3】:

检查您的令牌或加密文本是否具有三段。例如。

var segments = token.split('.');

如果段长度为 3,则标记是正确的。但如果不是,您必须检查您的令牌在创建和验证之间是否已被修改。

【讨论】:

【参考方案4】:

当我将一个混乱的回调传递给我的“then”语句时,这发生在我的 Angular 应用程序中。

// in my Auth Service

this.register = function (email, password) 
  return $http.post(API_URL + 'register', 
    email: email,
    password: password
  ).then(authSuccessful)
    .catch(authError);
;

function authSuccessful(res) 
  alert('success', 'Joy!', 'Welcome, ' + res.data.user.email + '.');
  // authToken.setToken just puts the token in local storage.
  authToken.setToken(res.token); // <- WRONG!!
  $state.go("connections");

应该是:

function authSuccessful(res) 
  alert('success', 'Joy!', 'Welcome, ' + res.data.user.email + '.');
  authToken.setToken(res.data.token); // <- Yay!
  $state.go("connections");

【讨论】:

以上是关于Express JWT 错误:socket.io 初始身份验证中的段不足或过多的主要内容,如果未能解决你的问题,请参考以下文章

React.js JWT Socket.io 身份验证

Express 4.0 中的 Heroku socket.io 示例错误

在 websockets 上 Express socket.io 错误 404

Socket.io Express Http-Server 后端,CORS 错误

Express.js 'socket.io/socket.io.js 404'

尝试在 Heroku 上部署 Node.js/Express/Socket.io 应用程序时出现应用程序错误