Tengo una aplicación de redes sociales y cuando un usuario desea cargar una imagen de perfil, debe obtener una firma del servidor. Este código funciona cuando elimino el ajuste preestablecido de carga en la interfaz, pero quiero el ajuste preestablecido de carga para que el usuario pueda cargar en una carpeta específica, y es un ajuste preestablecido de carga firmado, entonces, ¿por qué recibo el error 401 no autorizado?
en el backend
const generateSignature = async (req, res) => { /* It's just getting the current time in seconds. */ const timestamp = Math.round(new Date().getTime() / 1000); try { const signature = cloudinary.utils.api_sign_request( { timestamp, }, cloudinaryConfig.api_secret ); res.status(200).json({ success: true, timestamp, signature, api_key: cloudinaryConfig.api_key, cloud_name: cloudinaryConfig.cloud_name, }); } catch (err) { console.log(err); res.status(500).json({ success: false, message: "server error try again" }); } };en la interfaz
const { timestamp, signature, api_key, cloud_name } = signatureResponse.data; const formData = new FormData(); formData.append("file", image); formData.append("upload_preset", "uploadProfilePicture");// if i remove this line it works formData.append("api_key", api_key); formData.append("cloud_name", cloud_name); formData.append("signature", signature); formData.append("timestamp", timestamp); console.log(formData); const cloudinaryResponse = await axios.post( `https://api.cloudinary.com/v1_1/${cloud_name}/image/upload`, formData );En su código actual, solo está generando la firma de autenticación para su solicitud de carga utilizando el parámetro de timestamp de tiempo, sin embargo, eso en realidad debe incluir todos los parámetros que está pasando como parte de la llamada API a Cloudinary, excepto file , cloud_name , api_key y resource_type .
En otras palabras, según su ejemplo, si desea enviar un parámetro upload_preset a Cloudinary, deberá incluir upload_preset: "uploadProfilePicture" en el hash que está pasando a api_sign_request() para que luego envíe este parámetro en la solicitud de carga se incluirán en la generación de la firma. Esta es la razón por la que eliminar ese parámetro de la solicitud de carga da como resultado una carga exitosa, ya que en ese momento pasará los mismos valores con los que está generando la firma (es decir, solo la timestamp de tiempo).
Lo mismo se aplica a cualquier otro parámetro que desee pasar a Cloudinary. Por ejemplo, si luego desea enviar el parámetro use_filename establecido en true , también deberá incluirlo en su código de generación de firma. Efectivamente, su código de frontend debe enviar a su servidor todos los parámetros que desea enviar a Cloudinary para que su backend pueda generar una firma basada en ellos.
Sin relación con lo anterior, tenga en cuenta que los parámetros resource_type y cloud_name se pueden eliminar de su FormData . Esto se debe a que ambos ya se pasaron a Cloudinary a través del punto final de la URL de la API, es decir, https://api.cloudinary.com/v1_1/${cloud_name}/image/upload , donde su cloud_name se interpolará y el tipo de resource_type será image
Consulte también la siguiente referencia para realizar cargas directas y generar firmas para interactuar con la API de Cloudinary. Incluye más ejemplos y una guía paso a paso: https://cloudinary.com/documentation/upload_images#uploading_with_a_direct_call_to_the_rest_api