Esta puede ser una pregunta de novato (no he usado la API de fetch antes), pero no puedo entender qué es lo que está mal con mi solicitud.
fetch('https://securetoken.googleapis.com/v1/token?key=' + API_KEY, { method: 'POST', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, body: 'grant_type=refresh_token&refresh_token=' + refreshToken }) .then(response => console.log(response)) .catch(error => console.error(error)) Estoy tratando de cambiar un token de actualización por un token de identificación siguiendo las pautas aquí , pero por alguna razón recibo una respuesta de Bad Request ...
Response { type: "cors", url: "https://securetoken.googleapis.com/v1/token?key=[API_KEY]", redirected: false, status: 400, ok: false, statusText: "Bad Request", headers: Headers, body: ReadableStream, bodyUsed: false } Mi key es correcta, y el refreshToken también proviene directamente de una respuesta de un servicio en Firebase SDK.
¿Dónde está exactamente mi error?
ACTUALIZAR
{ code: 400, message: "INVALID_REFRESH_TOKEN", status: "INVALID_ARGUMENT" } .Entonces, esto parece ser un problema con refresh_token. ¿Puede ser porque ha sido emitido por Firebase Emulators?
useEffect(() => { return firebase.auth().onIdTokenChanged(async user => { if (user) { fetch('https://securetoken.googleapis.com/v1/token?key=' + process.env.NEXT_PUBLIC_FIREBASE_API_KEY, { method: 'POST', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, body: 'grant_type=refresh_token&refresh_token=' + user.refreshToken }) .then(response => console.log(response)) .catch(error => console.error(error)) } }) }, [])Al final, la causa del problema fue el hecho de que el refreshToken emitido al usar Firebase Emulators no es válido cuando se intercambia por un idToken.
Un caso bastante extremo, pero tal vez alguien pueda encontrar esto útil.