Как вы аутентифицируете приложение GitHub в Node.js?
Я создал новое приложение GitHub и пытаюсь пройти аутентификацию с помощью Node. Я новичок в приложениях GitHub, например, я не знаю, что такое "installationId". Это идентификатор приложения?
Я успешно получаю токен с помощью закрытого ключа, но когда я пытаюсь использовать API, я получаю сообщение об ошибке как от Node, так и от curl.
import { createAppAuth } from '@octokit/auth-app';
import { request } from '@octokit/request';
const privateKey = fs.readFileSync(__dirname + 'file.pem');
const auth = createAppAuth({
id: 1,
privateKey,
installationId: 12345,
clientId: 'xxx.xxxxxx',
clientSecret: 'xxxxxx',
});
const appAuthentication = await auth({ type: 'app' });
console.log(`Git repo token: ` + appAuthentication.token);
const result = await request('GET /orgs/:org/repos', {
headers: {
authorization: 'token ' + appAuthentication.token,
},
org: 'orgname',
type: 'public',
});
return res.status(200).json({ message: 'Git result: ' + result });
Вот пример curl, который я попробовал после получения токена из кода узла выше.
curl -i -X POST -H "Authorization: Bearer xxxxxxxxxx" -H "Accept: application/vnd.github.machine-man-preview+json" https://api.github.com/app
Результат в Node: "Результат Git: ошибка репозитория Git: HttpError: неверные учетные данные"
Результат в curl: { "message": "Интеграция не найдена", "documentation_url": "https://developer.github.com/v3"}
2 ответа
Аутентификация JSON Web Token (JWT) может использоваться только для нескольких конечных точек REST API GitHub. В основном те, которые перечислены на https://developer.github.com/v3/apps/
Для всех остальных вам понадобится токен доступа для установки.
Вы можете попробовать это вместо этого?
const { token } = await auth({ type: "installation" });
const result = await request("GET /orgs/:org/repos", {
headers: {
authorization: "token " + token
},
org: "orgname",
type: "public"
});
Обратите внимание, что installationId
параметр должен быть установлен на действительный идентификатор установки. Вы получите идентификатор установки при установке приложения GitHub на github.com. Например, вы можете установить приложение WIP по адресу https://github.com/apps/wip в своей учетной записи или в любой организации, к которой у вас есть доступ администратора. URL-адреса установки выглядят так:
https://github.com/settings/installations/90210
В приведенном выше примере идентификатор установки 90210
.
Чтобы упростить свой код, вы можете использовать auth.hook
функция, и в этом случае правильная аутентификация будет установлена автоматически на основе URL-адреса
import { createAppAuth } from "@octokit/auth-app";
import { request } from "@octokit/request";
const privateKey = fs.readFileSync(__dirname + "file.pem");
const auth = createAppAuth({
id: 1,
privateKey,
installationId: 12345
});
const requestWithAuth = request.defaults({
request: {
hook: auth.hook
}
})
const result = await requestWithAuth("GET /orgs/:org/repos", {
org: "orgname",
type: "public"
});
См. https://github.com/octokit/request.js/ для получения дополнительных примеров.
Любой, кто зашел сюда и использует Octokit, вот новый способ сделать это:
const config = {
appId: process.env.GITHUB_APP_ID,
privateKey: base64ToAscii(process.env.GITHUB_PRIVATE_KEY),
webhooks: {
secret: process.env.GITHUB_SIGNING_SECRET,
},
};
const app = new App(config);
// Get installationId from the installed app or a webhook event
const octokit =
await app.getInstallationOctokit(installationId);
const { data: user } = await octokit.rest.users.getByUsername({
username: login,
});