Javascript 我想了解passport js如何工作,以及如何填充数据

Javascript 我想了解passport js如何工作,以及如何填充数据,javascript,node.js,express,passport.js,Javascript,Node.js,Express,Passport.js,我是NodeJS新手,尝试使用passport进行身份验证,我发现很难理解工作流程。 所以我的问题是什么实际上是req.user它从哪里来的? 它是与passport相关的常量,不能更改为任何其他内容,如req.profile 其次是在下面的html代码中 <p> <strong>id</strong>: <%= user._id %><br> <strong>username</strong>: &

我是NodeJS新手,尝试使用passport进行身份验证,我发现很难理解工作流程。 所以我的问题是什么实际上是
req.user
它从哪里来的? 它是与passport相关的常量,不能更改为任何其他内容,如
req.profile

其次是在下面的html代码中

  <p>
  <strong>id</strong>: <%= user._id %><br>
  <strong>username</strong>: <%= user.local.username %><br>
  <strong>password</strong>: <%= user.local.password %>
  </p>

感谢您,passport是Node.js的身份验证中间件。而且它很容易实现

登录页面向passport发送用户名和密码

它将检查您配置的数据库

获得成功后,passport将用户详细信息存储到
req
会话表单中,您可以使用
req


passport
=>passport是Node.js的身份验证中间件。而且它很容易实现

登录页面向passport发送用户名和密码

它将检查您配置的数据库

获得成功后,passport将用户详细信息存储到
req
会话表单中,您可以使用
req


我将向您展示在不使用passport的情况下,
req.user
来自何处。您首先需要了解的是,express中的
中间件
只是一个函数,它接收
请求
响应
下一个函数

假设我有一个端点:

POST
/auth/login
,它使用
用户名
密码

该端点可以返回一个
访问令牌(由您生成并存储在数据库中的随机字符串,如果您不想存储在数据库中,可以查看JWT)

好的,现在您在登录成功后拥有了该访问令牌

您可以将其与其他请求一起传递到服务器。 让我们假设另一个端点:

获取受保护的
/auth/profile
,只有使用正确的
访问令牌才能访问它

但是什么是保护路线呢?它是一个
中间件

下面我们定义一个
checkAuth
中间件

function checkAuth(req, res, next) {
   // here I can retrieve accessToken from the request header 
   const accessToken = req.get('accessToken')
   // with this accessToken I can query the database and check if this access token is correct or not
   findUserWithTheAccessToken(accessToken)
      .then(user => {
        if (user) {
          // Here's the answer to your question where `req.user` comes from.
          req.user = user
          next() // call next() so it can go to the request handler
        } else {
          throw new Error('Invalid access token.')
        }
      })
}

// then your router would look something like the following
router.get('/auth/profile', checkAuth, handler) // implement your handler ☺️

您可以随时查看express网站了解更多信息。

我将向您展示无需使用passport的
req.user
的来源。您首先需要了解的是,express中的
中间件
只是一个函数,它接收
请求
响应
下一个函数

假设我有一个端点:

POST
/auth/login
,它使用
用户名
密码

该端点可以返回一个
访问令牌(由您生成并存储在数据库中的随机字符串,如果您不想存储在数据库中,可以查看JWT)

好的,现在您在登录成功后拥有了该访问令牌

您可以将其与其他请求一起传递到服务器。 让我们假设另一个端点:

获取受保护的
/auth/profile
,只有使用正确的
访问令牌才能访问它

但是什么是保护路线呢?它是一个
中间件

下面我们定义一个
checkAuth
中间件

function checkAuth(req, res, next) {
   // here I can retrieve accessToken from the request header 
   const accessToken = req.get('accessToken')
   // with this accessToken I can query the database and check if this access token is correct or not
   findUserWithTheAccessToken(accessToken)
      .then(user => {
        if (user) {
          // Here's the answer to your question where `req.user` comes from.
          req.user = user
          next() // call next() so it can go to the request handler
        } else {
          throw new Error('Invalid access token.')
        }
      })
}

// then your router would look something like the following
router.get('/auth/profile', checkAuth, handler) // implement your handler ☺️

您可以随时查看express网站了解更多信息。

req.profile来自您对passport所做的序列化,而您扩展的策略.req.profile来自您对passport所做的序列化以及您扩展的策略。因此,
req.user
是passport内部制作的东西,html
用户名如何?
从何处获取用户对象,或者后端如何将其发送到要填充的frondent?如果我正确的话,这将是一个模板引擎,我认为语法是ejs。基本上,您使用res.render('page',{user:{local:{username:'John}}})在视图中填充数据。因此,
req.user
是passport内部制作的东西,那么html
用户名
从何处获取用户对象,或者后端如何将其发送到要填充的frondent?这将是一个模板引擎,如果我正确的话,我认为语法是ejs。基本上,您可以使用res.render('page',{user:{local:{username:'John}}})来填充视图上的数据。