使用用户名和密码在WPF应用程序中进行GitHub身份验证

4
我正在开发一个小型的WPF应用程序,它将位于本地Git Repo之上。
这是一款业务应用程序,允许某些业务用户通过GUI编辑一些文件,然后将它们推送回GitHub。
我正在使用LibGit2Sharp库来处理所有git命令,但我还想强制用户每次加载应用程序时都使用他们的GitHub凭据登录应用程序。
我一直在研究OAuth2库和一些现有的nuget包(http://johnnycode.com/GitHubOAuth2Client/),但它们似乎都围绕着基于Web的应用程序,并需要客户端ID和秘密密钥。
有人能指点我一个简单的API,可以接受用户名和密码,并返回登录尝试的简单成功/失败,或者我必须编写自己的GitHub API包装器吗?

你不能使用简单的 git status 命令检查用户是否能够通过使用其凭据将代码推送到仓库吗? - stijn
那只会在克隆的存储库中本地检查。如果GitHub上随后撤销了权限,怎么办呢?无论如何,我已经想出来了...请参见下面答案中的解决方案。 - Eoin Campbell
1个回答

1
我最终通过对旧的v2 API进行简单的REST调用来解决这个问题,通过在auth标头中传递用户名和密码来请求特定的存储库。然后检查返回的请求存储库所具有的权限。
private class Permissions
{
     public bool Admin { get; set; }
     public bool Push { get; set; }
     public bool Pull { get; set; }
}

private class GitHubRepo
{
     public Permissions Permissions { get; set; }
     public string Name { get; set; }
}

public bool Authenticate(string userName, string password)
{
    try
    {
        var apiUrl = "https://api.github.com/";
        var resource = "repos/myAccount/";
        var repoName = "myRepo";

        var client = new RestClient
            {
                BaseUrl = apiUrl,
                Authenticator = new HttpBasicAuthenticator(userName, password)
            };

        var request = new RestRequest {Resource = string.Join("", resource, repoName)};

        var response = client.Execute<List<GitHubRepo>>(request);
        if ((int) response.StatusCode >= 200 && (int) response.StatusCode < 209)
        {
            if (response.Data.Any(r => r.Name == repoName))
            {
                var repo = response.Data.Single(r => r.Name == repoName);

                if (repo.Permissions.Admin || (repo.Permissions.Pull && repo.Permissions.Push))
                {
                    return true;
                }
            }
        }

        return false;
    }
    catch
    {
        return false;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接