Over a million developers have joined DZone.

How to Authenticate With JGit

In this post, Alex Soto shows you how to authenticate to a Git repository with JGit.

· DevOps Zone

The DevOps Zone is brought to you in partnership with Sonatype Nexus. The Nexus Suite helps scale your DevOps delivery with continuous component intelligence integrated into development tools, including Eclipse, IntelliJ, Jenkins, Bamboo, SonarQube and more. Schedule a demo today

JGit is a lightweight, pure Java library implementing the Git version control system. You can do a lot of operations using Java language, such as create or clone Git repos, create branches, make commits, rebase, or tag. You can look at this repo to learn how to use JGit and how to code the different commands.

But one thing that does not cover extensively is the authentication process. In this post, I am going to show you how to authenticate to a Git repository with JGit.

The first thing to do is add JGit as a Dependency:

<dependency>
  <groupId>org.eclipse.jgit</groupId>
  <artifactId>org.eclipse.jgit</artifactId>
  <version>4.5.0.201609210915-r</version>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.7.21</version>
</dependency>

Then let's see a simple clone without authentication:

@Test
public void should_connect_to_public_repo() throws IOException, GitAPIException {
  final String REMOTE_URL = "https://github.com/lordofthejars/wildfly-example.git";

  // prepare a new folder for the cloned repository
  File localPath = File.createTempFile("TestGitRepository", "");
  localPath.delete();

  // then clone
  try (Git result = Git.cloneRepository()
            .setURI(REMOTE_URL)
            .setDirectory(localPath)
            .call()) {
        // Important to close the repo after being used
            System.out.println("Having repository: " + result.getRepository().getDirectory());
  }
}

In this case, no authentication method is set. Now let's see how to add a username and password in case of for example private repos:


@Test
public void should_connect_using_user_pass() throws IOException, GitAPIException {
  final String REMOTE_URL = "https://asotobu@bitbucket.org/asotobu/backup.git";

  // prepare a new folder for the cloned repository
  File localPath = File.createTempFile("TestGitRepository", "");
  localPath.delete();

  // then clone
  try (Git result = Git.cloneRepository()
            .setURI(REMOTE_URL)
            .setCredentialsProvider(new UsernamePasswordCredentialsProvider("username", "password"))
            .setDirectory(localPath)
            .call()) {
            
          System.out.println("Having repository: " + result.getRepository().getDirectory());
  }
}

In this case, you only need to set as credential provider the UsernameAndPasswordCredentialsProvider and pass the required username and password.

The final scenario I am going to show here is how to authenticate against a git repository using your ssh keys, that is using (~/.ssh/id_rsa) and setting the passphrase to access it.

@Test
public void should_connect_to_public_ssh() throws IOException, GitAPIException {
  final String REMOTE_URL = "git@github.com:lordofthejars/wildfly-example.git";

  SshSessionFactory sshSessionFactory = new JschConfigSessionFactory() {
    @Override
    protected void configure(OpenSshConfig.Host host, Session session ) {
            session.setUserInfo(new UserInfo() {
              @Override
              public String getPassphrase() {
                return "passphrase";
              }

              @Override
              public String getPassword() {return null;}

              @Override
              public boolean promptPassword(String message) {return false;}

              @Override
              public boolean promptPassphrase(String message) {return true;}

              @Override
              public boolean promptYesNo(String message) {return false;}

              @Override
              public void showMessage(String message) {}
            });
        }
      };

  File localPath = File.createTempFile("TestGitRepository", "");
  localPath.delete();

  try (Git result = Git.cloneRepository()
          .setURI(REMOTE_URL)
          .setTransportConfigCallback(transport -> {
              SshTransport sshTransport = ( SshTransport )transport;
              sshTransport.setSshSessionFactory( sshSessionFactory );
          })
          .setDirectory(localPath)
          .call()) {
        System.out.println("Having repository: " + result.getRepository().getDirectory());
  }

}

In this case, you need to extend JSchConfigSessionFactory to be able to set the passphrase to access to the private key. To do it you set a custom UserInfo implementation where the getPassphrase method returns the passphrase to use and promptPassphrase method should return true.

After that, you only need to set the transport configuration to the one created.

The DevOps Zone is brought to you in partnership with Sonatype Nexus. Use the Nexus Suite to automate your software supply chain and ensure you're using the highest quality open source components at every step of the development lifecycle. Get Nexus today

Topics:
devops ,jgit ,authentication ,java

Published at DZone with permission of Alex Soto, DZone MVB. See the original article here.

Opinions expressed by DZone contributors are their own.

The best of DZone straight to your inbox.

SEE AN EXAMPLE
Please provide a valid email address.

Thanks for subscribing!

Awesome! Check your inbox to verify your email so you can start receiving the latest in tech news and resources.
Subscribe

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}