【问题标题】:if (!options.algorithms) throw new Error('algorithms should be set'); Error: algorithms should be setif (!options.algorithms) throw new Error('algorithms should be set');错误:应该设置算法
【发布时间】:2020-10-21 05:45:51
【问题描述】:

我开始学习 Nodejs,但我被困在中间的某个地方。我从 npm 安装了一个新库,即 express-jwt,它在运行后显示某种错误。附上错误代码和日志,请大家帮帮我!

const jwt = require('jsonwebtoken');
require('dotenv').config()
const expressJwt =  require('express-jwt');
const User = require('../models/user');




exports.requireSignin =  expressJwt({ secret:  process.env.JWT_SECRET});

下面是错误的日志。

[nodemon] starting `node app.js`
D:\shubh\proj\Nodejs\nodeapi\node_modules\express-jwt\lib\index.js:22
  if (!options.algorithms) throw new Error('algorithms should be set');
                           ^

**Error: algorithms should be set**
    at module.exports (D:\shubh\proj\Nodejs\nodeapi\node_modules\express-jwt\lib\index.js:22:34)
    at Object.<anonymous> (D:\shubh\proj\Nodejs\nodeapi\controllers\auth.js:64:26)
    at Module._compile (internal/modules/cjs/loader.js:1138:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1158:10)
 

【问题讨论】:

  • 对于那些想知道的人......旧的默认值显然是 ['HS256'] 我根据 Igor 的回答将一些遗留代码更改为该代码,它可以在没有破坏任何东西的情况下工作。 YMMV

标签: javascript node.js npm express-jwt


【解决方案1】:

您应该将算法属性添加到 jwt 构造函数。

示例;

expressJwt({ secret:  process.env.JWT_SECRET, algorithms: ['RS256'] });

【讨论】:

  • 嘿,谢谢,但你能告诉我我们如何决定选择哪种算法。
  • 它根据用途改变,如果你想将它用于会话,你可以使用HSXXX类型。如果您想将其用于跨应用程序身份验证(如 oauth)等,您可以首选 RSXXX 类型。 RS 类型是数字签名,HS 类型不是。
  • @Shubhamgupta 我建议你阅读这篇文章以更好地理解这两种算法之间的区别:stackoverflow.com/a/39239395/12404524
【解决方案2】:

6.0.0 版本中changes 引起的问题。 Documentation最近也更新了,上面写着:

需要算法参数以防止潜在的降级 将第三方库作为机密提供时的攻击。

所以现在指定算法属性是强制性的,像这样:

expressJwt({
  secret: 'secret',
  algorithms: ['HS256']
})

【讨论】:

  • 谢谢你——我在文档中看到HS256 是默认算法,所以我对为什么需要指定它感到困惑。原来 npm 上的文档还没有更新。
  • 谢谢。我正在寻找默认算法。
【解决方案3】:

如果上面的算法:['RS256']不起作用试试这个,算法:['HS256']

【讨论】:

    【解决方案4】:

    如果您遇到此错误,您可能正在使用新版本的“express-jwt” 降级到^5.3.3版本解决这个问题

    【讨论】:

    • 降级,应该永远是最后的解决方案。
    • 非破坏性更改和/或有关以非破坏性方式管理转换的适当文档应该是管理包的人员的第一个解决方案。
    【解决方案5】:
     exports.requireSignin = expressJwt ({
          secret: process.env.JWT_SECRET,
          algorithms: YOU CHOOSE ALGORITHM 
    });
    

    更多详情请访问: https://www.npmjs.com/package/express-jwt

    jwt({ secret: new Buffer('shhhhhhared-secret', 'base64') })
    

    【讨论】:

      【解决方案6】:

      对于那些徘徊使用什么算法来生成他们的令牌的人

      一个 JWT 由 3 个部分组成,用点 '.' 分隔:

      <header>.<payload>.<signature>
      

      标头(和有效负载)只是一个 Base64 编码的 JSON 对象,其中包含哈希算法的名称。

      例如,使用该令牌:

      eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJtZXNzYWdlIjoiaGkgc3RhY2tvdmVyZmxvdyJ9.01jBDw7uUgCr8cRMEQt4KJxfL6QLkt0ZuHly2AxdXZY
      

      您可以在浏览器的 javascript 控制台中使用 atob() 来解码标头:

      atob('eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9')
      // → "{\"alg\":\"HS256\",\"typ\":\"JWT\"}"
      

      这里使用的是HS256。

      【讨论】:

      • 这不能回答所提出的问题。如果您试图为已经提供的答案提供更多上下文,也许将其作为评论处理会更好?
      猜你喜欢
      • 2020-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多