使用私有 BitBucket 存储库进行身份验证以使用 JGit 进行克隆
Authentication with private BitBucket repository to clone with JGit
我想将远程私有 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
根据 this page,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 连接,您可以在 SshSessionFactory
的 configure
方法中提供密码,例如
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 Authentication Explained,我几年前写的一篇文章。
我遇到了同样的问题,在阅读了 Rudger Herrmann 的解决方案后,我仍然遇到用户身份验证失败的问题。我发现在添加自己的身份之前将行:defaultJSch.removeAllIdentity();
添加到覆盖的 createDefaultJSch
中解决了问题:
@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
中添加密码成为可选。
我想将远程私有 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
根据 this page,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 连接,您可以在 SshSessionFactory
的 configure
方法中提供密码,例如
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 Authentication Explained,我几年前写的一篇文章。
我遇到了同样的问题,在阅读了 Rudger Herrmann 的解决方案后,我仍然遇到用户身份验证失败的问题。我发现在添加自己的身份之前将行:defaultJSch.removeAllIdentity();
添加到覆盖的 createDefaultJSch
中解决了问题:
@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
中添加密码成为可选。