Tengo problemas para firmar usuarios con Devise debido al formato de las credenciales que se envían a la ruta users/sign_in. Aquí está mi código del lado del cliente para enviar la solicitud:

  async function handleSubmit() {
    const bodyFormData = new FormData();
    bodyFormData.append('user', JSON.stringify(credentials));

    try {
      const res = await axios({
        method: 'post',
        url: url,
        data: bodyFormData,
        headers: { 'Content-Type': 'multipart/form-data' }
      });
      console.log('Status: ', res.status);
      setSignedIn(true);
    } catch (err) {
      console.log(err.toJSON());
    }
  }

Y aquí está la respuesta del servidor:

Started POST "/users/sign_in" for ::1 at 2020-08-22 18:12:55 -0700
Processing by Devise::SessionsController#create as HTML
  Parameters: {"{\"email\":\"fake@email.com\",\"password\":\"password\"}"=>"[FILTERED]"}
Completed 401 Unauthorized in 0ms (ActiveRecord: 0.0ms | Allocations: 170)

Como puede ver, JSON.stringify está escapando caracteres innecesariamente. Cuando envío una solicitud con Postman, funciona bien:

Started POST "/users/sign_in" for ::1 at 2020-08-22 17:44:37 -0700
Processing by Devise::SessionsController#create as */*
  Parameters: {"user"=>{"email"=>"fake@email.com", "password"=>"[FILTERED]"}}
  User Load (0.5ms)  SELECT "users".* FROM "users" WHERE "users"."email" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["email", "fake@email.com"], ["LIMIT", 1]]
Completed 200 OK in 269ms (Views: 0.3ms | ActiveRecord: 0.7ms | Allocations: 4545)
0
dya26 23 ago. 2020 a las 04:17

1 respuesta

La mejor respuesta

Establezca el tipo de contenido en json si así es como desea enviar sus datos

const res = await axios({
  method: 'post',
  url: url,
  data: credentials,
  headers: { 'Content-Type': 'application/json' }
});

O simplemente agregue los datos del formulario normalmente sin usar JSON.stringify, pero creo que tendrá mejor suerte con algo como esto:

bodyFormData.append('user[username]', credentials.username);
bodyFormData.append('user[password]', credentials.password);
1
Juan Fuentes 23 ago. 2020 a las 07:33