📁

Octokit.NETを利用し、デバイスフロー認証を使用して、任意のリポジトリに直接ファイルを追加する

2024/10/05に公開

解法

Octokit.NETライブラリとデバイスフロー認証を使用して、GitHubの任意のリポジトリにファイルを追加する手順は以下の通りです:

  1. GitHub OAuth Appを作成する
  2. Octokit.NETライブラリをプロジェクトに追加する
  3. デバイスフロー認証を実装してアクセストークンを取得する
  4. GitHubクライアントを初期化し、認証する
  5. リポジトリにファイルを追加する

解説

1. GitHub OAuth Appの作成

  1. GitHubの"Settings" > "Developer settings" > "OAuth Apps"に移動
  2. "New OAuth App"をクリックし、必要な情報を入力
    • 重要: Authorization callback URLにはhttp://localhostを入力
    • 注意: アプリケーションの設定で「Enable Device Flow」オプションを必ず有効にしてください
  3. アプリケーションを作成後、Client IDを取得

2. Octokit.NETのインストール

NuGetパッケージマネージャーを使用して、Octokit.NETをプロジェクトに追加します。

dotnet add package Octokit

3. デバイスフロー認証の実装

using Octokit;

var client = new GitHubClient(new ProductHeaderValue("YourAppName"));
var clientId = "YOUR_CLIENT_ID"; // OAuth Appから取得したクライアントID

var request = new OauthDeviceFlowRequest(clientId);
request.Scopes.Add("repo"); // リポジトリへのアクセス権を要求

var deviceFlow = await client.Oauth.InitiateDeviceFlow(request);
Console.WriteLine($"Please visit: {deviceFlow.VerificationUri}");
Console.WriteLine($"And enter the code: {deviceFlow.UserCode}");

var token = await client.Oauth.CreateAccessTokenForDeviceFlow(clientId, deviceFlow);
client.Credentials = new Credentials(token.AccessToken);

4. リポジトリへのファイル追加

string owner = "RepositoryOwner";
string repoName = "RepositoryName";
string path = $"{DateTime.Now:yyyyMMdd-HHmmss}.txt";
string content = "Hello, World!";
string commitMessage = "Add new file via Octokit.NET";

try
{
    var fileRequest = new CreateFileRequest(commitMessage, content, branch: "main");
    var result = await client.Repository.Content.CreateFile(owner, repoName, path, fileRequest);

    Console.WriteLine($"File created successfully: {result.Content.Path}");
}
catch (ApiException ex)
{
    Console.WriteLine($"Error creating file: {ex.Message}");
}

補足情報

  • デバイスフロー認証は、デスクトップアプリケーションやCLIツールに適しています。
  • repo スコープを要求することで、プライベートリポジトリを含む全リポジトリへのアクセスが可能になります。
  • エラーが発生した場合、認証スコープとリポジトリへのアクセス権限を確認してください。
  • セキュリティのため、アクセストークンは安全に管理し、必要最小限の権限のみを要求することが重要です。
  • リポジトリのデフォルトブランチが "main" でない場合、ファイル作成時のブランチ名を適切に変更してください。

この方法を使用することで、Octokit.NETライブラリとデバイスフロー認証を介して、GitHubの任意のリポジトリに直接ファイルを追加することができます。

Discussion