通过中间件从 Firebase 验证 ID 令牌后,快速响应方法不起作用

Express response methods don't work after verifying ID token from Firebase through a middleware

我正在尝试在客户端使用带有 ejs 模板的 Firebase 和 NodeJS 构建 Web 应用程序。我想确保在通过中间件访问特定路由之前对用户进行身份验证。在这个中间件中,我验证通过客户端发送的 ID 令牌,然后在验证通过后呈现页面。但是当验证令牌时,应用程序不会显示新页面,即 "user-profile.ejs".

<button onclick="sendRequest('/profile')">Profile</button>

//The client function which sends ID token 
function sendRequest(url){
  if(firebase.auth().currentUser){
    firebase.auth().currentUser.getIdToken(true)
    .then(idToken => {
      client({
        method: 'get',
        url: url,
        headers: {
          'authtoken': idToken
        }
      })
      .then(res => {
          console.log("Auth token sent.")      
      })
      .catch(err => {
        console.log(err)
      })
    })
    .catch(err => {
      console.log(err)
    })
    }else{
      client({
        method: 'get',
        url: url,
      }).then(res => {
         console.log("Request sent without header.")
      })
      .catch(err => {
        console.log(err)
      })
   }
}

//The NodeJS server which contains the routes and checkAuth middleware

function checkAuth(req,res,next){
  if(req.headers.authtoken){
    console.log('Auth token with headers received. User has logged in.')
    admin.auth().verifyIdToken(req.headers.authtoken)
    .then(verifiedUser => {
      console.log('Auth token verified')
      return next()
    })
    .catch(err => {
      console.log(err)
      res.redirect('back')
    })
  }else{
    console.log('Without header received.')
    res.redirect('back')
  }
}

app.get('/',(req,res)=>{
  res.render('home')
})


app.get('/profile',checkAuth,(req,res)=>{
  console.log("Reached user profile")
  res.send("user-profile")
})

请记住,当您重定向时,客户端会收到重定向的 URL 并发出一个全新的 http 请求。这将在您的服务器上启动一个全新的请求周期,该周期将再次遍历所有匹配新 URL.

的中间件

自动客户端重定向不包括来自原始响应的自定义 header。如果那是您所期望的,那将行不通。如果您从 Ajax 调用中手动跟踪重定向,则可以从重定向响应 header 中手动获取令牌,然后手动将其添加到新的 Ajax 调用中以重定向到重定向位置。

如果您希望浏览器或某些自动重定向处理重定向,它们不会从 header 中带走令牌。因此,您的服务器将不得不在不重定向的情况下将响应发送到原始 URL ,或者您必须将令牌放在能够在重定向中幸存下来的东西中,例如重定向上的查询参数(通常是一个坏主意凭据)或在 cookie 中或在与 cookie 绑定的 server-side session object 中。