Brak odpowiedzi serwera przy weryfikacji użytkownika

0

Cześć,

Chciałem stworzyć póki co prostą aplikację internetową, zaczynając od "modułu" logowania i rejestracji. Rejestracja śmiga, ale przy logowaniu tworzony jest fetch, dla którego nie zwracana jest żadna wartość, a on sam po jakimś czasie sie przedawnia.

Kodu jest dość sporo, więc wrzuciłem go na GitHuba: https://github.com/zoriV/chatapp

Z góry dzięki

0

Nie jestem pewien czy komuś będzie się chciało to analizować.
Może opisz dokładniej gdzie leży problem. W jakim module? W jakim pliku?

0
katakrowa napisał(a):

Nie jestem pewien czy komuś będzie się chciało to analizować.
Może opisz dokładniej gdzie leży problem. W jakim module? W jakim pliku?

racja, miałem to zrobić, ale wyleciało mi z głowy.

Problem jest w module /src/utils/router, z jakiegoś powodu, od serwera nie wraca żadna odpowiedź: screenshot-20220606203037.png

mam nadzieję, że wytłumaczyłem, co tu nie działa :/

0

Twój plik

router
  .route("/login")
  .get((req, res, next) => {
    res.render("login");
  })
  .post((req, res, next) => {
    passport.authenticate("local", {
      failureRedirect: "/register",
      successRedirect: "/",
    });
  });

vs

dokumentacja https://www.passportjs.org/concepts/authentication/middleware/

app.post('/login/password',
  passport.authenticate('local', { failureRedirect: '/login', failureMessage: true }),
  function(req, res) {
    res.redirect('/~' + req.user.username);
  });

Nie jestem w 100% pewien, ale wydaje mi się, że passport.authenticate zwraca po prostu middlewarea (https://expressjs.com/en/guide/using-middleware.html) z którym nic nie robisz.

W tym przykładzie co podałem najpierw zostanie uruchomiony middleware passport.authenticate i jeśli login/hasło będzie prawidłowe to zostanie wykonane przekierowanie na /<nazwa_uzytkownika>. Przy błędnych danych użytkownik powinien zostać przekierowany na podstronę /login.

0
Xarviel napisał(a):

Twój plik

router
  .route("/login")
  .get((req, res, next) => {
    res.render("login");
  })
  .post((req, res, next) => {
    passport.authenticate("local", {
      failureRedirect: "/register",
      successRedirect: "/",
    });
  });

vs

dokumentacja https://www.passportjs.org/concepts/authentication/middleware/

app.post('/login/password',
  passport.authenticate('local', { failureRedirect: '/login', failureMessage: true }),
  function(req, res) {
    res.redirect('/~' + req.user.username);
  });

Nie jestem w 100% pewien, ale wydaje mi się, że passport.authenticate zwraca po prostu middlewarea (https://expressjs.com/en/guide/using-middleware.html) z którym nic nie robisz.

W tym przykładzie co podałem najpierw zostanie uruchomiony middleware passport.authenticate i jeśli login/hasło będzie prawidłowe to zostanie wykonane przekierowanie na /<nazwa_uzytkownika>

router
  .route("/login")
  .get((req, res, next) => {
    res.render("login");
  })
  .post((req, res, next) => {
    console.log("test1"); //test
    passport.authenticate(
      "local",
      {
        failureRedirect: "/register",
        successRedirect: "/",
      },
      (reqest, resp) => {
        console.log("test2"); //test
        resp.redirect("/");
      }
    );
  });

Do routera odpowiedzialnego za login roboczo dodałem dwa log'i, a wykonuje się tylko ten pierwszy, tak, jakby callback zupelnie sie nie wykonywal
screenshot-20220606230106.png

(Zakomentowałem jeszcze testowo fetcha, tak, aby wykonywał się czysty fetch, ale zupełnie nic to nie zmienia)

0

No okej, ale Twój zapis różni się od tego co podałem. Testowałeś też to co wkleiłem?

Tylko app z przykładu musisz zamienić na swój router

router.get("/login", (req, res) => { 
  res.render("login"); 
});

router.post(
  '/login', 
  passport.authenticate('local', {
    failureRedirect: '/login',
    failureMessage: true 
  }),
  (req, res) => {
    console.dir('udało się zalogować');
    console.dir('i robię teraz przekierowanie na /<username>');
    
    res.redirect('/~' + req.user.username);
  }
);

Musisz poczytać, czym jest middleware, bo w taki sposób jak tego użyłeś w swoim przykładzie to raczej nie zadziala.

0

@Viroz: Nie działa, bo źle napisałeś kod. Dałeś callback jako drugi argument do passporta, a to błąd. Callback masz wykonywać do metody HTTP. Poprawny schemat:

app.post('/route', middleware, (req, res) => {})

Przy czym middleware jest passportem w Twoim przypadku.

0

racja, nie zauważyłem tej zmiany.

router
  .route("/login")
  .get((req, res, next) => {
    res.render("login");
  })
  .post(
    passport.authenticate("local", {
      failureRedirect: "/login",
      failureMessage: true,
    }),
    function (req, res, next) {
      res.redirect("/");
    }
  );

teraz wygląda to tak, ale przy zalogowaniu się, użytkownik nie jest przekierowywany, cały czas wykonuje się failureRedirect, niezależnie od tego, czy dane są poprawne, czy nie

1 użytkowników online, w tym zalogowanych: 0, gości: 1