为什么每个请求都会执行passport.serializeUser?

2024-01-05

我使用 Passport.js + Passport-facebook-token 通过 Strongloop 的环回框架来保护我的 API 构建。

为什么护照反序列化成功后还要再次序列化反序列化的用户?每个请求都会调用 Passport.authenticate 方法!我究竟做错了什么?

这是节点的日志:

deserializeUser, id: XXXXXXXXXXXXXXXX
User found.
serializeUser, id: XXXXXXXXXXXXXXXX
GET /api/events?access_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 304 182ms

这是js代码:

passport.use(new FacebookTokenStrategy({
    clientID: XXXXXXXXXXXXXXXX,
    clientSecret: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXX'
  },
  function(accessToken, refreshToken, profile, done) {
    //check user table for anyone with a facebook ID of profile.id
    User.findOne({
      'facebookId': profile.id
    }, function(err, user) {
      if (err) {
        return done(err);
      }
      if (user) {
        console.log("User found.");
        return done(err, user);
      } else {
        console.log("User not found.");
        User.create({
          email: profile.emails[0].value,
          facebookId: profile.id,
          password: 'secret'
        }, function(err, user) {
          console.log(user.id);
          console.log(user.email);
          console.log(user.facebookId);
          console.log("User created");
          return done(err, user);
        });
      }
    });
  }));

passport.serializeUser(function(user, done) {
  console.log('serializeUser, id: ' + user.facebookId);
  done(null, user.facebookId);
});

passport.deserializeUser(function(id, done) {
  console.log('deserializeUser, id: ' + id);
  User.findOne({
    'facebookId': id
  }, function(err, user) {
    if (!err) {
      done(null, user);
    } else {
      done(err, user);
    }
  });
});

关于你的问题为什么passport.authenticate在每个请求上调用,这是因为您将其定义为中间件,可能在任何路由逻辑发生之前。

如果您有私人and您的应用程序上的公共部分,您可以执行类似的操作:

// Define a specific that will handle authentication logic
app.get("/auth", passport.authenticate('facebook-token',function(){...});

// Public sections which do not require authentication
app.get("/public1",...);
app.post("/public2",...);

// Private sections which do require authentication
app.get("/private1", function(req,res,next){
   if (req.isAuthenticated()){ // Check if user is authenticated
       // do things...
   }else{ // Wow, this guy is not authenticated. Kick him out of here !
       res.redirect("/auth");
   }
});

现在,如果您有多个私有部分,您可能会发现为每个私有部分执行相同的操作有点繁琐。 您可以定义一个自定义函数来检查用户是否经过身份验证,如果经过身份验证则允许请求继续进行。 就像是

function isThisGuyAuthenticated(req,res,next){
   if (req.isAuthenticated()){
      return next(); // Ok this guy is clean, please go on !
   }else{
      res.redirect("/auth"); // This guy is shady, please authenticate !
   }
}

并像这样使用它:

app.get("/private1",isThisGuyAuthenticated, doCrazySecretStuff); // doCrazySecretStuff will not be called if the user is not authenticated
app.get("/private2", isThisGuyAuthenticated, getCocaColaRecipe);
app.get("/private3", isThisGuyAuthenticated, flyToMars);
app.get("/public", showInfo); // showInfo will be called whether the user is authenticated or not

现在,如果您的应用程序只有私有部分,您可以避免重复调用isThisGuyAuthenticated通过将其定义为中间件(但不是通过定义passport.authenticate本身作为中间件!);

// Endpoint that will be hit is the user is redirected to /auth
// BEWARE it needs to be above the middleware, otherwise you'll end up with an infinite redirection loop
app.get("/auth", passport.authenticate('facebook-token',function(){...});

// Middleware that will be called on every request
app.use(isThisGuyAuthenticated);

// You app's endpoints
app.get("/private1", doCrazySecretStuff); // doCrazySecretStuff will not be called if the user is not authenticated
app.get("/private2", getCocaColaRecipe);
app.get("/private3", flyToMars);

明白了吗 ?

EDIT:我错误地将中间件放在“/auth”端点之前。确保将其放置在之后

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么每个请求都会执行passport.serializeUser? 的相关文章

随机推荐

  • PowerShell 字符串插值语法

    我总是使用以下语法来确保变量在字符串中扩展 my string with a variable 我最近遇到了以下语法 my string with a variable 它们相等吗 有什么区别吗 tl dr Inside 只需要嵌入整个表达
  • ARM 上的快速浮点到整数转换和浮点精度 (iPhone 3GS/4)

    I read http www stereopsis com FPU html http www stereopsis com FPU html 中提到 在 x86 上将 float 转换为 int 的最快方法是什么 https stack
  • 扩展Python中的内置类

    如何扩展 python 中的内置类 我想向 str 类添加一个方法 我已经做了一些搜索 但我发现的只是较旧的帖子 我希望有人知道更新的内容 只需对类型进行子类化 gt gt gt class X str def my method self
  • 为什么 iPhone 请求 .m3u8 播放列表文件 4 次?

    为什么 iPhone 请求 m3u8 播放列表文件 4 次 并且 是否可以让它仅请求一次 请求执行如下 第一个是完整的请求 第二个是字节范围请求 范围为0 1 第三个是完整文件的另一个字节范围请求 最终的请求又是一个完整的请求 注意 iPh
  • 如何查看应用程序当前使用的堆大小?

    我想我在 NetBeans 中将堆大小增加到 1 GB 因为我将配置更改为如下所示 netbeans default options J Xmx1g 重新启动 NetBeans 后 我能否确定我的应用程序现在已获得 1 GB 空间 有没有办
  • 访问应用的外部脚本中的 buildscript 块中定义的类路径依赖项

    我最初的目标是能够使用中定义的类路径依赖项buildscript in build gradle 在导入的脚本内build gradle using apply from 但是 由于无法解析类 因此外部脚本无法编译 研究这个问题后 我发现逻
  • 我的 Flex 文件输出错误

    我编写了一个 l 文件并希望输出 c17 isc 中的内容 但有一个错误我不知道为什么 我已经给出了我打算读取的文件 flex文件和执行结果 这是 c17 isc 文件 内容的意思是 number gate name gate type o
  • 您可以使用 ffmpeg 流实时插入文件中的文本吗?

    我有这个代码 用于流式传输文件 并将视频某个时间的视频节目名称 name of show 放置在屏幕顶部 屏幕底部则显示节目名称来自 video title txt 并将其放置在屏幕底部 我想要做的是找到一种方法 每隔 1 或 2 分钟 提
  • 如何在 Sonata Media Bundle 中实现多对多关系

    我正在尝试将 SonataMediaBundle 与另一个实体相关联 Products具有多对多关系 架构和关系创建得很好 但是 当我编辑或创建新产品时 我尝试添加一个可以通过媒体库搜索媒体文件的按钮和一个上传新文件的按钮 对于 OneTo
  • 直接链接获取谷歌自定义搜索API密钥?

    我有一个 API 密钥 用于在 json 搜索 API 上进行 Google 自定义搜索查询 如下所示 我需要将客户端发送到一个 URL 每个客户端都可以在其中获取其域的自定义 API 密钥 但是 我不记得用于获取 API 密钥的 URL
  • JavaScript、Node.js:Array.forEach 是异步的吗?

    我有一个关于本地人的问题Array forEachJavaScript 的实现 它的行为是异步的吗 例如 如果我打电话 many many elements forEach function lots of work to do 这会是非阻
  • 在 Mathematica 中使用 $NewSymbol 移动上下文

    我正在玩 NewSymbol试图找到答案这个问题 https stackoverflow com q 6165977 421225 with 文档说 http reference wolfram com mathematica ref 24
  • iOS 上的 javascript 除了在其框架内执行之外,是否还必须由 WebKit 框架下载?

    协议是这样说的 3 3 2 内部使用应用程序不得下载或安装可执行代码 如果所有脚本 代码和解释器都打包在应用程序中并且未下载 则解释的代码只能在应用程序中使用 上述唯一的例外是由 Apple 内置 WebKit 框架下载和运行的脚本和代码
  • TensorFlow 2.0:如何更新张量?

    在 TensorFlow 1 x 中 要更新张量 我会使用tf scatter update 仅更新张量的相关部分 我们如何在 TF 2 0 中做同样的事情 您可以使用tf tensor scatter nd update https ww
  • 在文本中查找相关单词的算法

    我想要一个单词 例如 Apple 并处理一个文本 或者可能更多 我想提出相关术语 例如 处理 Apple 的文档并发现 iPod iPhone Mac 是与 苹果 相关的术语 关于如何解决这个问题有什么想法吗 作为起点 您的问题涉及文本挖掘
  • 如何在C中打印方阵的所有方子矩阵?

    请帮我用C编程语言找到并打印从大到小方阵的所有方阵子矩阵 我写的代码运行错误 int main int mtrx size 8 int mat 8 8 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
  • 创建触发器以插入到另一个表中

    我在执行下面的触发器时遇到一些问题 CREATE OR REPLACE TRIGGER AFTERINSERTCREATEBILL AFTER INSERT ON READING FOR EACH ROW DECLARE varReadNo
  • 使用 JWT 和 OpenID Connect 在微服务中进行客户端身份验证

    我对微服务架构中的身份验证有一些疑问 我现在有一个整体应用程序 我的目标是将应用程序拆分为小型微服务 我最大的问题是身份验证 目前 阅读大量文档后 似乎最好的解决方案是使用 OpenID Connect 对用户进行身份验证以检索 JWT 该
  • 通过 JSch 的 SFTP 抛出错误 4:失败

    我在尝试通过 SFTP 将文件从 Windows 传输到 Unix 服务器时遇到了一个特殊问题 错误 堆栈跟踪 是 4 Failure at com jcraft jsch ChannelSftp throwStatusError Chan
  • 为什么每个请求都会执行passport.serializeUser?

    我使用 Passport js Passport facebook token 通过 Strongloop 的环回框架来保护我的 API 构建 为什么护照反序列化成功后还要再次序列化反序列化的用户 每个请求都会调用 Passport aut