使用私有BitBucket仓库进行身份验证以使用JGit克隆

3
我希望将一个远程的Atlassian BitBucket私有代码库克隆到我的电脑上。
您能否描述一下如何完成这个过程。
我特别关心认证过程。我是否需要使用(针对Atlassian BitBucket)UsernamePasswordCredentialsProvider 作为 CredentialsProvider,还是需要执行其他步骤才能完成?
更新:
我尝试了以下方案:
    SshSessionFactory sshSessionFactory = new JschConfigSessionFactory() {
        @Override
        protected void configure(Host host, Session session) {
            session.setPassword( "password" );
            session.setConfig("StrictHostKeyChecking", "no");
        }
    };
    CloneCommand cloneCommand = Git.cloneRepository();
    cloneCommand.setURI("ssh://user@bitbucket.org/reponame.git");
    //cloneCommand.setURI("git@bitbucket.org:user/reponame.git");
    cloneCommand.setDirectory(new File("reponame"));
    cloneCommand.setTransportConfigCallback(new TransportConfigCallback() {
        @Override
        public void configure(Transport transport) {
            SshTransport sshTransport = (SshTransport) transport;
            sshTransport.setSshSessionFactory(sshSessionFactory);
        }
    }); 
    cloneCommand.call();

但是它会出现以下异常:

    Exception in thread "main" org.eclipse.jgit.api.errors.TransportException: git@bitbucket.org:user/reponame.git: Auth fail
    at org.eclipse.jgit.api.FetchCommand.call(FetchCommand.java:248)
    at org.eclipse.jgit.api.CloneCommand.fetch(CloneCommand.java:306)
    at org.eclipse.jgit.api.CloneCommand.call(CloneCommand.java:200)
    at com.bitbucket.BitBucketTest.cloneViaSsh(BitBucketTest.java:63)
    at com.bitbucket.BitBucketTest.main(BitBucketTest.java:39)
Caused by: org.eclipse.jgit.errors.TransportException: git@bitbucket.org:user/reponame.git: Auth fail
    at org.eclipse.jgit.transport.JschConfigSessionFactory.getSession(JschConfigSessionFactory.java:172)
    at org.eclipse.jgit.transport.SshTransport.getSession(SshTransport.java:140)
    at org.eclipse.jgit.transport.TransportGitSsh$SshFetchConnection.<init>(TransportGitSsh.java:280)
    at org.eclipse.jgit.transport.TransportGitSsh.openFetch(TransportGitSsh.java:170)
    at org.eclipse.jgit.transport.FetchProcess.executeImp(FetchProcess.java:137)
    at org.eclipse.jgit.transport.FetchProcess.execute(FetchProcess.java:123)
    at org.eclipse.jgit.transport.Transport.fetch(Transport.java:1269)
    at org.eclipse.jgit.api.FetchCommand.call(FetchCommand.java:237)
    ... 4 more
Caused by: com.jcraft.jsch.JSchException: Auth fail
    at com.jcraft.jsch.Session.connect(Session.java:519)
    at org.eclipse.jgit.transport.JschConfigSessionFactory.getSession(JschConfigSessionFactory.java:126)
    ... 11 more
2个回答

6
根据这个页面,Bitbucket允许通过SSH进行身份验证。在这种情况下,您不需要CredentialsProvider
但是,您可能需要提供一个SshSessionFactory
SshSessionFactory sshSessionFactory = new JschConfigSessionFactory() {
  @Override
  protected void configure( Host host, Session session ) {
    // ...
  }
};
CloneCommand cloneCommand = Git.cloneRepository();
cloneCommand.setURI( "ssh://user@example.com/repo.git" );
cloneCommand.setTransportConfigCallback( new TransportConfigCallback() {
  @Override
  public void configure( Transport transport ) {
    SshTransport sshTransport = ( SshTransport )transport;
    sshTransport.setSshSessionFactory( sshSessionFactory );
  }
} );

请注意,在TransportConfigCallback::configure中,传输参数被盲目地转换为SshTransport,这意味着此TransportConfigCallback仅适用于SSH URL。
如果您的Bitbucket服务器需要密码保护的SSH连接,您可以在SshSessionFactoryconfigure方法中提供密码,例如:
SshSessionFactory sshSessionFactory = new JschConfigSessionFactory() {
  @Override
  protected void configure( Host host, Session session ) {
    session.setPassword( "password" );
  }
} );

私钥从<user-home>/.ssh加载。如果您的私钥文件命名不同或位于其他位置,我建议覆盖createDefaultJSch()。调用基本方法后,可以像这样添加自定义私钥:
@Override
protected JSch createDefaultJSch( FS fs ) throws JSchException {
  JSch defaultJSch = super.createDefaultJSch( fs );
  defaultJSch.addIdentity( "/path/to/private_key" );
  return defaultJSch;
}

如需更详细信息,您可能想要阅读我几年前写的一篇文章《JGit身份验证详解》


谢谢您的回答!您能否请检查一下我的更新问题,因为您的解决方案出现了异常。这可能是什么原因,如何修复? - alexanoid
我使用https访问时使用的密码。在https的情况下它可以工作,但在ssh的情况下则失败了。 - alexanoid
你尝试过不设置密码吗?你的本地ssh目录在哪里?ssh URL是否符合Bitbucket规范? - Rüdiger Herrmann
是的,我做了。此外,我正在我的 Windows 10 机器上测试此功能,因此不确定此处的 ssh 目录。测试 URL 是我直接从 BitBucket 复制的。顺便说一下 - 基于 https 的解决方案运行良好。我只是无法通过 Java 和这种 ssh 方法克隆仓库... - alexanoid
请查看我编辑后的答案,了解 SSH 密钥的搜索位置。 - Rüdiger Herrmann
显示剩余2条评论

0

我遇到了同样的问题,在阅读了Rudger Herrmann的解决方案后,我仍然无法通过用户验证。我发现在覆盖createDefaultJSch之前添加以下行:defaultJSch.removeAllIdentity();可以解决这个问题:

@Override
protected JSch createDefaultJSch(FS fs) throws JSchException {
    JSch defaultJSch = super.createDefaultJSch(fs);
    defaultJSch.removeAllIdentity();
    defaultJSch.addIdentity("path/to/key", "password");
    return defaultJSch;
}

我猜这样做可以防止defaultJSch使用一些奇怪的默认配置,强制它使用你添加的身份验证?此外,在defaultJSch::addIdentity中添加密码使在configure中添加密码成为可选项。


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