Java 使用JGit授权错误推送到GitLab

Java 使用JGit授权错误推送到GitLab,java,git,gitlab,jgit,oauth2,Java,Git,Gitlab,Jgit,Oauth2,我可以通过JGit从GitLab进行克隆,但当我去推送更改时,会收到一条未授权的错误消息 还有三个更重要的细节: 我拥有存储库,因此它不是只读访问的问题 存储库是私有的,因此我知道OAuth 2令牌是有效的,并且正在初始克隆中使用 我只有用户名和oauth2令牌。我没有用户的密码、SSH密钥或个人访问令牌 以下是我的克隆命令: Git.cloneRepository() .setURI(target) .setDirectory(repoFolder) .setCloneAllBra

我可以通过JGit从GitLab进行克隆,但当我去推送更改时,会收到一条
未授权的
错误消息

还有三个更重要的细节:

  • 我拥有存储库,因此它不是只读访问的问题

  • 存储库是私有的,因此我知道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();
    

    通过下面的代码片段,我可以从GitLab存储库中克隆并推回到该存储库

    CredentialsProvider credentialsProvider = new 
         UsernamePasswordCredentialsProvider( "PRIVATE-TOKEN", <your oauth token> );
    git.push()
         .setCredentialsProvider( credentialsProvider )
         .call();
    
    CredentialsProvider CredentialsProvider
    =新用户名PasswordCredentialsProvider(“myname”、“password”);
    Git Git=Git.cloneRepository()
    .setURI(“https://gitlab.com/myname/repo.git" )
    .setDirectory(tempFolder.newFolder())
    .setCredentialsProvider(credentialsProvider)
    .call();
    File File=新文件(git.getRepository().getWorkTree(),“File”+新对象().hashCode());
    createNewFile();
    git.add().addFilepattern(file.getName()).call();
    git.commit().setMessage(“添加文件”+file.getName()).call();
    git.push()
    .setCredentialsProvider(credentialsProvider)
    .call();
    
    如果您使用的是GitLab的个人访问令牌,则需要将访问令牌编码到URL中,并将其作为密码提供,如下所示:

    CredentialsProvider CredentialsProvider
    =新用户名PasswordCredentialsProvider(“myname”和“”);
    command.setURI(“https://gitlab-ci-token:@gitlab.com/myname/repo.git)
    command.setCredentialsProvider(credentialsProvider)
    

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

    要使用个人访问令牌和jgit对GitLab进行身份验证,可以使用以下代码段:


    通过下面的代码片段,我可以推回到GitLab存储库

    CredentialsProvider credentialsProvider = new 
         UsernamePasswordCredentialsProvider( "PRIVATE-TOKEN", <your oauth token> );
    git.push()
         .setCredentialsProvider( credentialsProvider )
         .call();
    
    CredentialsProvider CredentialsProvider=new
    UsernamePasswordCredentialsProvider(“专用令牌”);
    git.push()
    .setCredentialsProvider(credentialsProvider)
    .call();
    

    这从Jgit版本(4.8.0.201706111038-r)起生效。

    我正在使用OAuth2访问令牌从Jgit使用Git.lsRemoteRepository()方法

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

        LsRemoteCommand cmd = Git.lsRemoteRepository();
        cmd.setRemote(cloneUrl);
        cmd.setCredentialsProvider(new UsernamePasswordCredentialsProvider("oauth2", gitlab-access-token));
    
    该url是一个私有Gitlab存储库的url-

    您使用哪种协议进行克隆和推送?必须向凭据提供程序提供您的真实用户名(即,该用户名也是URL的一部分)。
    oauth2
    是您的真实用户名吗?您问题中的第3点表明您没有足够的权限对推送进行身份验证。我使用的是HTTP协议。。我试着用我的真实用户名而不是oauth2,但这也不起作用。使用我的用户名,我甚至无法克隆回购协议。@dlamblin我不确定我是否理解。。。有了GitHub,这一切都很好,GitLab中的oauth2令牌有什么不同吗?我想我没有提到这一点,我将没有用户的密码、SSH密钥或个人访问令牌。我能访问的唯一信息是用户名和oauth2令牌。@user3817808您能描述一下GitLab的web UI用户名和oauth令牌是如何/在何处管理的,以便我能够重现您的环境吗?我不知道如何通过web UI获取oauth令牌,但我可以按照以下流程获得:PS我确实拥有测试用户的用户名/密码,但对于我的应用程序的所有其他用户,我不会。谢谢你让我知道。从我的尝试来看,RESTAPI的功能与Profile Settings>Applications中的web UI相同。我已经发布了你的问题——用我自己的话来说——我相信你从UI中得到的只是一个应用程序id/秘密。。这与oauth2令牌不同。查看您的GitLab帖子,您应该能够使用
    git clone进行克隆https://oauth2:a1b2c3@gitlab.com/user/repo.git
    ,至少我能。这应该是公认的答案;它工作得很好。非常感谢您的分享。