Как загрузить файлы с помощью Octokit на Github, подписанный проверенным ярлыком? - PullRequest
0 голосов
/ 09 апреля 2020

Используя Octokit REST API , у меня работает аутентификация, и я пытаюсь загрузить, используя createOrUpdateFile , который также работает. У меня есть мои коммиты приложения GitHub App в настоящее время.

Но при просмотре всех коммитов этим приложением просто отображается следующее сообщение:

enter image description here

Я хочу, чтобы мои коммиты запустить через пользователя, которого я сделал MerlinPanelBot. Поэтому я могу просматривать все коммиты, сделанные этим пользователем, и иметь более подробную аналитику в профиле пользователя (MerlinPanelBot) и для понимания каждого проекта, код фиксирует.

Есть ли простой способ использовать моего нового пользователя MerlinPanelBot в моем коде И подтвердили коммиты?

Возможно, мне нужно посмотреть на использование oAuth и / или получение персонального токена доступа для запуска непосредственно от имени пользователя? Надеюсь, что это простое исправление.


Прогресс на данный момент:

  1. Если не предоставить коммиттера, он передаст верифицированный ключ GPG с именем приложения Github merlin-panel-deploy-bot. Это хорошо, но я хочу, чтобы он запускался через нового пользователя, которого я создал MerlinPanelBot.

  2. Я установил коммиттер для своей собственной учетной записи LukeXF, чтобы проверить, что он работает. Это произошло, но на моем коммите нет подтвержденной метки GPG.

committer: {
    name: "LukeXF",
    email: '<my email (redacted)>'
},

Я попытался изменить адрес электронной почты в коммиттере на MerlinPanelBot (пользователь), который при запуске кода выдавал неавторизованную ошибку.

Добавление файла PEM для MerlinPanelBot на странице приложения GitHub для пользователя MerlinPanelBot (как показано ниже) позволяет запускать мой код, но все еще нет подтвержденной метки GPG. enter image description here

Пуляризованные точки: enter image description here


Код

Несмотря на то, что проверка подлинности, чтение, буферизация и отправка файлов с использованием Github / Octokit заняли много времени, мой код на самом деле довольно прост:

Файл маршрута:

const installationAccessToken = await GithubClass.getInstallationAccessToken('repoExample');
const octokit = new Octokit({
    auth: `token ${installationAccessToken}`
});
const fromGithub = await GithubClass.sendFile(octokit, 'repoExample', 'MERLIN.md', req.body.lineToAdd, req.userId);
return res.send(fromGithub);

Встроенный octokit auth:

// as explained above I have two PEM files for my two account used in testing.
const pemFile = path.resolve(__dirname, '../app.2020-02-02.private-key.pem');

async getInstallationAccessToken(repo) {
    const privateKey = fs.readFileSync(pemFile);
    const app = new App({id: '52777', privateKey});
    const jwt = app.getSignedJsonWebToken();

    // Example of using authenticated app to GET an individual installation
    // https://developer.github.com/v3/apps/#find-repository-installation
    const {data} = await request("GET /repos/:owner/:repo/installation", {
        owner: "element-softworks",
        repo,
        headers: {
            authorization: `Bearer ${jwt}`,
            accept: "application/vnd.github.machine-man-preview+json"
        }
    });
    // contains the installation id necessary to authenticate as an installation
    const installationId = data.id;

    // return installationId;
    return await app.getInstallationAccessToken({
        installationId,
    });
},

Функция для обновления файла:

async sendFile(octokit, repo, path, lineToAdd, userId) {
    const repos = await octokit.repos.getContents({
        owner: 'element-softworks',
        repo,
        path
    });

    const {sha} = repos.data;
    let file = Buffer.from(repos.data.content, 'base64').toString();

    file += `
${lineToAdd} by ${userId}`;

    return await octokit.repos.createOrUpdateFile({
        owner: 'element-softworks',
        repo,
        path,
        message: `Updating product ${lineToAdd} by ${userId}`,
        content: Buffer.from(file).toString('base64'),
        committer: {
            name: "Luke",
            email: '<my email (redacted)>'
        },
        sha
    })
}
...