Express методы ответа не работают после проверки идентификатора токена из Firebase через промежуточное ПО - PullRequest
0 голосов
/ 13 апреля 2020

Я пытаюсь создать веб-приложение с использованием Firebase и NodeJS с шаблонами e js на клиенте. Я хочу убедиться, что пользователь прошел аутентификацию, прежде чем получить доступ к определенному маршруту через промежуточное ПО. В этом промежуточном программном обеспечении я проверяю идентификационные токены, отправленные через клиента, и затем отображаю страницу, если они проверены. Но когда токены проверены, приложение не показывает новую страницу, т.е. "user-profile.e js".

<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")
})

1 Ответ

0 голосов
/ 16 апреля 2020

Помните, что при перенаправлении клиент получает перенаправленный URL-адрес и выдает совершенно новый http-запрос. Это запускает совершенно новый цикл запросов на вашем сервере, который будет go снова проходить через все ваше промежуточное ПО, которое соответствует этому новому URL.

Перенаправления клиента Automati c НЕ содержат пользовательских заголовков из исходного ответа. Если это то, что вы ожидали, это не сработает. Если вы выполняете перенаправление вручную из вызова Ajax, вы можете вручную получить токен из заголовка ответа перенаправления и вручную добавить его в новый вызов Ajax в перенаправленном местоположении.

Если вы вы ожидаете, что браузер или какое-либо автоматическое перенаправление c выполнит перенаправление, они не будут брать с собой токен из заголовков. Таким образом, ваш сервер должен будет либо отправить ответ на исходный URL-адрес без перенаправления, либо вы должны будете поместить токен во что-то, что выдержит перенаправление, такое как параметр запроса на перенаправление (обычно плохая идея для учетных данных) или в поваре ie или в объекте сеанса на стороне сервера, который привязан к повару ie.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...