Necesito guardar jwt-token en el almacenamiento local a través de nodejs después de que el usuario haya iniciado sesión (haya sido autorizado).

Después de verificar si el usuario / contraseña es correcta en mi controlador, guardo el token generado en el almacenamiento local. Tal como está, no puedo hacer referencia a la ventana, ya que no existe.

ReferenceError: window is not defined 

Así es como estoy tratando de hacerlo actualmente.

...
      payload = {
        sub: user.email,
        role: user.role
      };

      token = jwt.sign(payload, jwtSecretKey, {expiresIn: '60m'});

      window.localStorage.setItem('token', token);

      res.status(200).render('index' , {
        user: user,
        token: token
      });
...
7
Paran0a 12 may. 2016 a las 12:21

3 respuestas

La mejor respuesta

No puede guardar en localStorage en Node.js, pero puede hacerlo en un navegador, posiblemente después de enviarlo desde un servidor, para su caso desde un servidor en Node.js.

Debe enviar el token desde el servidor (que se ejecuta en Node.js) al cliente (navegador) que tiene un objeto window, que tiene localStorage y getItem y {{X3} relacionados } métodos, puede hacer referencia desde su código JavaScript para el cliente (navegador). Node.js no tiene ningún window para hacer referencia. Por lo tanto, al hacer referencia a él en el código Node.js obtendrá un error undefined que haya encontrado.

Simplemente colóquelo en una cookie y envíelo, o envíelo a través de una respuesta json. Luego, en el navegador del cliente guárdelo en window.localStorage.

El siguiente es el código de ejemplos para la última forma; enviando a través de una respuesta:

// SERVER-SIDE Code
// say `app` is your app server on node.js
// this is a url handler on your server-side code
// you just have sent your user credentials from a browser
// typically via a form in the body of your http request
app.post('/auth', function (req, res) {
  // you may have here some jwt token creation things
  // ...
  // and send it as your response to the client (probably a web browser) ..
  // with your prefrred name as the key, say 'my_token', ..
  // where you will save it to localStorage (ie. window.localStorage)
  res.json({my_token: 'asdfgh-anything-jw-token-qwerty'})
})

// CLIENT-SIDE Code (may be a web browser)
// You have just sent a request to the server..
// ..with user credentials for authentication in the request body
// in the request body may be a window.FormData object or a json etc.
http.post('auth', userCredentials)
  // probably the request mechanism you make http..
  // ..requests asynchronously, maybe using a library,..
  // ..will return a Promise, and you will have a similar code below.
  .then(response => {
    response.json()
      .then(responseJson => {
        // set localStorage with your preferred name,..
        // ..say 'my_token', and the value sent by server
        window.localStorage.setItem('my_token', responseJson.my_token)
        // you may also want to redirect after you have saved localStorage:
        // window.location.assign("http://www.example.org")
      })
  })
8
Selçuk 21 may. 2019 a las 19:45

En la llamada del cliente a / login use el objeto xmlhttpresponse, luego agregue un detector de eventos para 'cargar'. Esto le dará al cliente el ResponseObject donde ha agregado el token. Luego, en caso de que el oyente ponga su código de almacenamiento local

1
user2331566 11 ene. 2017 a las 13:43

Si te refieres a html 5 localStorage, no existe tal cosa ya que node.js es una tecnología del lado del servidor. HTML 5 localStorage es una característica del lado del cliente compatible

Consulte ¿Cómo acceder a localStorage en node.js?

1
Community 23 may. 2017 a las 12:25