使用Passport .js有没有办法为同一条路由指定多个身份验证提供者?

例如(来自passport指南),我可以在下面的示例路由上使用本地策略、facebook策略和twitter策略吗?

app.post('/login',
  passport.authenticate('local'), /* how can I add other strategies here? */
  function(req, res) {
    // If this function gets called, authentication was successful.
    // `req.user` contains the authenticated user.
    res.redirect('/users/' + req.user.username);
  });

推荐答案

Passport的中间件的构建方式允许您在一次passport.authenticate(...)呼叫中使用多种策略.

但是,它是用OR命令定义的.也就是说,只有在所有策略都没有成功的情况下,它才会失败.

以下是您将如何使用它:

app.post('/login',
  passport.authenticate(['local', 'basic', 'passport-google-oauth']), /* this is how */
     function(req, res) {
       // If this function gets called, authentication was successful.
       // `req.user` contains the authenticated user.
       res.redirect('/users/' + req.user.username);
});

换句话说,使用它的方法是传递一个数组,其中包含您希望用户进行身份验证的策略的名称.

此外,别忘了事先设定你想要实施的策略.

您可以在以下github文件中确认此信息:

Authenticate using either basic or digest in multi-auth example.

Passport's authenticate.js definition

Node.js相关问答推荐

无法从Nextjs项目读取环境变量

需要关于基于角色授权的设计建议

对接Nestjs/VueJS应用程序

Node-Red Tasmota 错误:连接 ECONNREFUSED 192.168.77.21:1883

运行本地移动自动化测试时,在onPrepare钩子中,ERROR @wdio/cli:utils: A service failed in the 'onPrepare'

Nodejs 从链接数组中获取数据并保存到 mongodb

等待不在 Express.js 中处理 res.app.render

node-gyp: "..\src\binding.cc: 没有这样的文件或目录"

强制 TypeScript 生成带有.js扩展名的导出/导入;运行 node 16?

带有事件网格的 Azure 函数在没有 ngrok 的情况下在本地运行

tsc:当我上传 React+next js 和 node 项目时,在 heroku 找不到

`npm install` 以Killed结尾

您如何写入 aws lambda 实例的文件系统?

如何使用 UglifyJS 缩小文件夹中的多个 Javascript 文件?

与 NPM 一起安装时找不到 Express 模块

运行摩卡+伊斯坦布尔+通天塔

带有加密的nodejs中的SALT和HASH密码

MongoDB Node findone如何处理没有结果?

Nodejs将字符串转换为UTF-8

`return function *(){...}` 是什么意思?