Estoy tratando de descargar la última versión de un repositorio privado específico. Puedo recopilar información utilizando esta solicitud GET:
const handleDownload = async () => { const token = "{Very secret token not for StackOverflow}"; const owner = {company}; const response = await fetch( `https://api.github.com/repos/${owner}/${repo}/releases/latest`, { //mode: 'no-cors', headers: { Authorization: 'Bearer ' + token, }, } ); const log = await response.json(); console.log(log); }Esta llamada devuelve algunos datos, incluida la propiedad 'zipball_url', de donde creo que proviene mi descarga. Sin embargo, si trato de realizar una solicitud a esta URL (incluido mi token), recibo un desagradable error de CORS:
Acceso para buscar en 'https://codeload.github.com/{company}/{reponame}/legacy.zip/refs/tags/1.1.7?token={secret token}' (redireccionado desde 'https:// api.github.com/repos/{company}/{reponame}/zipball/1.1.7') del origen 'http://localhost:3000' ha sido bloqueado por la política de CORS: la respuesta a la solicitud de verificación previa no pasa el acceso comprobación de control: no hay ningún encabezado 'Access-Control-Allow-Origin' en el recurso solicitado. Si una respuesta opaca satisface sus necesidades, establezca el modo de la solicitud en 'no-cors' para obtener el recurso con CORS deshabilitado.
Los documentos de la API de Github no me están ayudando mucho. ¿Alguien puede explicarme cómo solucionar esto?
zipball_url simplemente redirige al subdominio codeload.github.com y Github no permite el acceso público a CORS.
Si desea que el usuario descargue el archivo, simplemente use zipball_url directamente en un elemento <a download>
const [ zipUrl, setZipUrl ] = useState(null) const downloadRef = useRef(null) const getLatestRelease = async () => { // this is greatly simplified with no error handling for brevity const res = await fetch(yourGithubUrl) return (await res.json()).zipball_url } useEffect(() => { getLatestRelease().then(setZipUrl) }, []) useEffect(() => { // trigger download if (zipUrl) { downloadRef.current.click() } }, [ zipUrl ]) return zipUrl && ( <a download ref={downloadRef} href={zipUrl} > Download </a> ) Otra opción es usar window.open(zipball_url) pero eso abrirá una nueva pestaña.
También recibí el mismo error: { "mensaje": "No encontrado", "documentación_url": "https://docs.github.com/rest/reference/repos#download-a-repository-archive" }
y se resolvió cuando me registré en la siguiente URL, se resolvió:
Para iniciar sesión, use un navegador web para abrir la página https://microsoft.com/devicelogin e ingrese el código XXXXXXXXXXX para autenticarse.