Como dice el título, recibí un error de solicitud incorrecta 400 cuando intenté cambiar el código por un token de acceso contra https://app.asana.com/-/oauth_token .
Sinceramente, no puedo pensar en lo que podría estar causando esto. Publicaré el código y agradecería la ayuda de cualquiera.
const GetAsanaAccessToken = async (req, res) => { const body = { grant_type: 'authorization_code', client_id: process.env.NEXT_PUBLIC_ASANA_CLIENT_ID, client_secret: process.env.ASANA_CLIENT_SECRET, redirect_uri: process.env.NEXT_PUBLIC_ASANA_REDIRECT_URI, code: req.body.code // The code obtained in the previous flow goes here. }; console.log({ body }); const url = 'https://app.asana.com/-/oauth_token'; const response = await fetch(url, { method: 'POST', headers: { Accept: 'application/json', 'Content-Type': 'application/x-www-form-urlencoded' }, body: JSON.stringify(body) }) .then((res) => { console.log({ res }); return res.json(); }) .catch((err) => { console.log({ err }); return err; }); res.status(200).json(response); };exportar GetAsanaAccessToken predeterminado; Entonces { res } será así
{ res: Response { size: 0, timeout: 0, [Symbol(Body internals)]: { body: [PassThrough], disturbed: false, error: null }, [Symbol(Response internals)]: { url: 'https://app.asana.com/-/oauth_token', status: 400, statusText: 'Bad Request', headers: [Headers], counter: 0 } } }Hice la misma pregunta en el foro de Asana, pero como a menudo no se resuelve, también la publiqué aquí.
Esta es la causa.
body: JSON.stringify(body)Reemplazado arriba con abajo, luego trabajado.
body: Object.keys(body) .map((key) => `${key}=${encodeURIComponent(body[key])}`) .join('&');Porque el original resultó en
{"grant_type":"authorization_code","client_id":"xxx","client_secret":"xxx","redirect_uri":"http://localhost:3000/","code":"xxx"}Funcionó cuando hice que se viera como el de abajo (solo lo hice a mano, por lo que realmente codifica barras, etc.) en lugar del de arriba.
grant_type=authorization_code&client_id=xxx&client_secret=xxx&redirect_uri=http://localhost:3000/&code=xxx