You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用JGit克隆私有BitBucket仓库的认证问题及报错排查

克隆私有Atlassian BitBucket仓库的完整流程(含认证踩坑指南)

先直接回答你的核心疑问:UsernamePasswordCredentialsProvider只适用于HTTPS协议的认证,SSH认证完全不需要它——这也是你当前代码出现Auth Fail的关键原因之一。下面我分两种主流认证方式详细拆解流程,重点解决你遇到的SSH认证问题。

一、HTTPS 认证(用UsernamePasswordCredentialsProvider的正确姿势)

如果你想用这个Provider,那得走HTTPS协议,而且现在BitBucket有个重要限制:

如果你开启了双因素认证(2FA),必须用App Password替代账号的原始登录密码;即使没开2FA,官方也推荐用App Password(更安全,权限可管控)。

具体步骤:

  1. 生成BitBucket App Password
    登录BitBucket后,进入个人设置 → 找到「App passwords」→ 点击「Create app password」,给它分配至少Repository Read的权限,保存生成的密码(只显示一次,记得复制)。

  2. Java代码实现

import org.eclipse.jgit.api.CloneCommand;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;

import java.io.File;

public class BitBucketHttpsClone {
    public static void main(String[] args) throws Exception {
        CloneCommand cloneCommand = Git.cloneRepository()
                .setURI("https://bitbucket.org/your-username/your-repo-name.git")
                .setDirectory(new File("local-repo-directory"))
                .setCredentialsProvider(new UsernamePasswordCredentialsProvider(
                        "your-bitbucket-username",  // 你的BitBucket账号名,不是邮箱
                        "your-generated-app-password"  // 刚才生成的App Password
                ));
        cloneCommand.call();
    }
}

二、SSH 认证(解决你当前的Auth Fail问题)

你的代码用了SSH协议但尝试密码登录,这是行不通的——BitBucket默认禁用了SSH密码登录(除非你特意在账号设置里开启,极度不推荐),官方要求用SSH密钥对认证。

解决步骤:

  1. 生成本地SSH密钥对
    在终端执行命令(Windows用Git Bash或PowerShell):
ssh-keygen -t ed25519 -C "your-email@example.com"

一路回车即可(不需要设置passphrase,当然设置了更安全),生成的密钥默认在~/.ssh/id_ed25519(私钥)和~/.ssh/id_ed25519.pub(公钥)。

  1. 把公钥添加到BitBucket
    登录BitBucket → 个人设置 → 「SSH keys」→ 点击「Add key」,复制id_ed25519.pub里的全部内容粘贴进去,保存即可。

  2. 修改你的Java代码(密钥对版本)
    不需要硬编码密码,直接加载本地私钥即可:

import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import org.eclipse.jgit.api.CloneCommand;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.transport.JschConfigSessionFactory;
import org.eclipse.jgit.transport.SshTransport;
import org.eclipse.jgit.transport.TransportConfigCallback;
import org.eclipse.jgit.util.FS;

import java.io.File;

public class BitBucketSshClone {
    public static void main(String[] args) throws Exception {
        SshSessionFactory sshSessionFactory = new JschConfigSessionFactory() {
            @Override
            protected void configure(com.jcraft.jsch.Host host, com.jcraft.jsch.Session session) {
                // 生产环境不建议关闭StrictHostKeyChecking,建议提前把bitbucket.org的主机密钥加到~/.ssh/known_hosts
                session.setConfig("StrictHostKeyChecking", "no");
            }

            @Override
            protected JSch createDefaultJSch(FS fs) throws JSchException {
                JSch jsch = super.createDefaultJSch(fs);
                // 加载本地私钥,这里用默认路径,如果你改了密钥路径要对应修改
                jsch.addIdentity(System.getProperty("user.home") + "/.ssh/id_ed25519");
                // 如果你的密钥设置了passphrase,用这个重载方法:
                // jsch.addIdentity(System.getProperty("user.home") + "/.ssh/id_ed25519", "your-passphrase");
                return jsch;
            }
        };

        CloneCommand cloneCommand = Git.cloneRepository()
                .setURI("git@bitbucket.org:your-username/your-repo-name.git")
                .setDirectory(new File("local-repo-directory"))
                .setTransportConfigCallback(new TransportConfigCallback() {
                    @Override
                    public void configure(org.eclipse.jgit.transport.Transport transport) {
                        SshTransport sshTransport = (SshTransport) transport;
                        sshTransport.setSshSessionFactory(sshSessionFactory);
                    }
                });
        cloneCommand.call();
    }
}

为什么你的原代码会Auth Fail?

BitBucket的SSH服务器默认拒绝密码登录请求,哪怕你代码里设置了正确的密码,服务器端也会直接拒绝。只有在个人设置→Security里开启「SSH password authentication」(非常不推荐,风险高),密码登录才可能生效,但官方强烈建议用密钥对认证。

三、总结

  • 用HTTPS:可以用UsernamePasswordCredentialsProvider,但必须搭配App Password(2FA开启时强制要求)
  • 用SSH:不需要UsernamePasswordCredentialsProvider,必须用SSH密钥对认证,密码登录基本不可行

内容的提问来源于stack exchange,提问作者alexanoid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:29:51