推送到 GitLab 时出现 JGit 授权错误

use*_*808 5 java git oauth-2.0 jgit gitlab

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

三个更重要的细节:

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

  2. 该存储库是私有的,因此我知道 OAuth 2 令牌是有效的并且正在初始克隆中使用。

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

这是我的克隆命令:

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

这是我的推送命令:

PushCommand push = cloneSource.push();
  push.setRemote(target);
  push.setPushAll();
  push.setCredentialsProvider(new UsernamePasswordCredentialsProvider("oauth2", token));
  push.call();
Run Code Online (Sandbox Code Playgroud)

小智 6

要使用个人访问令牌和 jgit 验证 gitlab,您可以使用以下代码片段:

通过下面的代码片段,我能够推送回 GitLab 存储库。

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

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


Rüd*_*ann 4

通过下面的代码片段,我能够从 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();
Run Code Online (Sandbox Code Playgroud)

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

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

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