使用 JGit 授权错误推送到 GitLab

Posted

技术标签:

【中文标题】使用 JGit 授权错误推送到 GitLab【英文标题】:Push to GitLab with JGit authorization error 【发布时间】:2017-02-28 06:54:32 【问题描述】:

我可以通过 JGit 从 GitLab 进行克隆,但是当我推送更改时,我收到了 not authorized 错误消息。

三个更重要的细节:

    我拥有存储库,因此只读访问不存在问题。

    存储库是私有的,所以我知道 OAuth 2 令牌是有效的并且在初始克隆中使用。

    我只有用户名和 oauth2 令牌。我没有用户密码、SSH 密钥或个人访问令牌。

这是我的克隆命令:

Git.cloneRepository()
  .setURI(target)
  .setDirectory(repoFolder)
  .setCloneAllBranches(true)
  .setCredentialsProvider(new UsernamePasswordCredentialsProvider("oauth2", token))
  .call();

这是我的推送命令:

PushCommand push = cloneSource.push();
  push.setRemote(target);
  push.setPushAll();
  push.setCredentialsProvider(new UsernamePasswordCredentialsProvider("oauth2", token));
  push.call();

【问题讨论】:

你使用哪种协议来克隆和推送? 必须为凭证提供者提供您的真实用户名(即也是 URL 一部分的用户名)。 oauth2 是你的真实用户名吗? 问题中的第 3 点表明您没有足够的权限来验证自己的身份以进行推送。 我正在使用 HTTP 协议。我尝试使用我的真实用户名而不是 oauth2,但这也不起作用。使用我的用户名,我什至无法首先克隆 repo。 @dlamblin 我不确定我是否理解...使用 GitHub 可以正常工作,GitLab 中的 oauth2 令牌有区别吗? 【参考方案1】:

使用下面的 sn-p,我能够从 GitLab 存储库中克隆并推送回 GitLab 存储库。

CredentialsProvider credentialsProvider 
  = new UsernamePasswordCredentialsProvider( "myname", "password" );
Git git = Git.cloneRepository()
  .setURI( "https://gitlab.com/myname/repo.git" )
  .setDirectory( tempFolder.newFolder() )
  .setCredentialsProvider( credentialsProvider )
  .call();

File file = new File( git.getRepository().getWorkTree(), "file" + new Object().hashCode() );
file.createNewFile();
git.add().addFilepattern( file.getName() ).call();
git.commit().setMessage( "Add file " + file.getName() ).call();

git.push()
  .setCredentialsProvider( credentialsProvider )
  .call();

如果您使用 GitLab 的个人访问令牌,您需要将访问令牌编码到 URL 作为密码提供,如下所示:

CredentialsProvider credentialsProvider 
  = new UsernamePasswordCredentialsProvider( "myname", "<token>" );
command.setURI( "https://gitlab-ci-token:<token>@gitlab.com/myname/repo.git" )
command.setCredentialsProvider( credentialsProvider )

也许这将有助于找到“未授权”错误的来源。为了通过 SSH 进行通信,您需要将 SSH 密钥添加到您的 GitLab 配置文件中。

【讨论】:

我想我没有提到这一点,我不会有用户的密码、SSH 密钥,也没有个人访问令牌。我可以访问的唯一信息是用户名和 oauth2 令牌。 @user3817808 你能描述一下 GitLab 的 Web UI 是如何/在哪里管理用户名和 oauth 令牌的,以便我能够重现你的环境吗? 我不知道如何通过 Web UI 获取 oauth 令牌,但我可以按照以下流程获取它:docs.gitlab.com/ce/api/oauth2.html PS 我确实有测试用户的用户名/密码,但对于我的应用程序的所有其他用户,我不会。 感谢您告诉我。根据我的尝试,REST API 的作用与 Profile Settings > Applications 中的 Web UI 相同。我已经发布了你的问题 - 用我自己的话 - to the GitLab forum 我相信您从 UI 获得的只是一个应用程序 ID/秘密。这与 oauth2 令牌不同。查看您的 GitLab 帖子,您应该可以使用 git clone https://oauth2:a1b2c3@gitlab.com/user/repo.git 进行克隆,至少我可以。【参考方案2】:

使用个人访问令牌和jgit对gitlab进行身份验证,可以使用如下sn-p:

使用下面的 sn-p,我能够推送回 GitLab 存储库。

CredentialsProvider credentialsProvider = new 
     UsernamePasswordCredentialsProvider( "PRIVATE-TOKEN", <your oauth token> );
git.push()
     .setCredentialsProvider( credentialsProvider )
     .call();

这适用于 Jgit 版本 (4.8.0.201706111038-r)

【讨论】:

这应该是公认的答案;效果很好。非常感谢您的分享。【参考方案3】:

我正在使用来自 JGit 的 Git.lsRemoteRepository() 方法,使用 OAuth2 访问令牌。

像这样设置 UsernamePasswordCredentialsProvider 实际上对我有用:

    LsRemoteCommand cmd = Git.lsRemoteRepository();
    cmd.setRemote(cloneUrl);
    cmd.setCredentialsProvider(new UsernamePasswordCredentialsProvider("oauth2", gitlab-access-token));

该 url 是一个私有 Gitlab 存储库- https://gitlab.com/my-private-group/testprojectxyxy.git

【讨论】:

以上是关于使用 JGit 授权错误推送到 GitLab的主要内容,如果未能解决你的问题,请参考以下文章

每当我尝试通过 git 推送到远程仓库时都会发生错误。我已经尝试过使用我的 github 和 gitlab 帐户

推送到 gitlab 时要求输入密码?

无法将现有项目克隆或推送到gitlab

如何使用 gitlab-ci 作业推送到 gitlab 存储库?

GitLab 错误消息 - 权限被拒绝(公钥) - Bitnami

尝试使用 Gitlab CI 创建 SSH 连接,错误:SSH Permission denied (publickey,password)