typescript - Hur kan jag använda GitHub REST API för att få tillgång till en fils data i ett privat repository som ägs av en organisation via min personliga åtkomsttoken?
Problem
Jag ansvarar för att försöka hämta JSON-data från en fil i ett privat arkiv i mitt företags organisation. Jag är ägare av organisationen, men får hela tiden antingen ett 404- eller 401-fel när jag använder min personliga åtkomsttoken som genererats från mitt GitHub-konto.
Varför kan jag inte använda OAuth
Denna Node-app kommer att användas som en del av GH Actions i ett repository, och en användare kommer inte kunna logga in för att verifiera åtkomst vid varje push till repositoryt. Därför letar jag efter en lösning som använder någon form av åtkomsttoken.
Saker jag försökte:
Granskning av andra StackOverflow-frågor, som alla antingen inte var relevanta, inte fungerade, inte besvarades eller var inaktuella.
- Åtkomst till privata repositories i organisationer på Github Enterprise via REST (Närmaste problemet till mitt, ingen lösning)
.raw delen av Accept-huvudet varje gång.Accept-huvudet.Authorization: "token TOKEN" och Authorization: "Bearer TOKEN" med varje URL.Kod som jag för närvarande använder
https
.get(
// "https://raw.githubusercontent.com/ORG_NAME/REPO_NAME/main/path/data.json", // results in 404 error
"https://api.github.com/repos/ORG_NAME/REPO_NAME/contents/path/data.json", // results in 403 error
{
headers: {
// request the v3 version of the api
Accept: "application/vnd.github.v3.raw+json",
"Content-Type": "application/json;charset=UTF-8",
Authorization: `token ${process.env.GH_TOKEN}`,
},
},
res => {
const statusCode = res.statusCode;
const contentType = res.headers["content-type"] || "";
let error;
if (statusCode !== 200) {
error = new Error(
"Request Failed.\n" +
`Status Code: ${statusCode}: ${res.statusMessage}`
);
} else if (!/^application\/json/.test(contentType)) {
error = new Error(
"Invalid content-type.\n" +
`Expected application/json but received ${contentType}`
);
}
if (error) {
console.log(error.message);
// consume response data to free up memory
res.resume();
return;
}
res.setEncoding("utf8");
let rawData = "";
res.on("data", chunk => (rawData += chunk));
res.on("end", () => {
try {
const parsedData = JSON.parse(rawData);
console.log(parsedData);
} catch (e) {
if (e instanceof Error) console.log(e.message);
}
});
})
.on("error", e => {
console.log(`Got error: ${e.message}`);
});
Typ av "fungerar" men inte en idealisk lösning
Vad som fungerar är att använda denna URL: https://raw.githubusercontent.com/ORG_NAME/REPO_NAME/main/path/data.json?token=SOME_RANDOM_GENERATED_TOKEN, med den genererade token som läggs till efter att ha klickat på Raw-knappen från repossidan. Jag vill uppenbarligen inte använda denna token för en produktions-Action.
Hur kan jag få detta att fungera? Är det ens möjligt just nu?
Svar #1
Jag försökte med nedanstående begäran och det fungerade.
GET 'https://raw.githubusercontent.com/ORG_NAME/REPO_NAME/main/README.md' \
Authorization:'token <Personal Access Token>'
Problemet kan vara i förfrågnings-URL - Det verkar som att du inkluderar /path/ i förfrågnings-URL som inte krävs. Du behöver ange den faktiska sökvägen till filen, så korrekt URL kommer att vara
https://raw.githubusercontent.com/ORG_NAME/REPO_NAME/main/data.json
