使用 JGit 授权错误推送到 GitLab
Posted
技术标签:
【中文标题】使用 JGit 授权错误推送到 GitLab【英文标题】:Push to GitLab with JGit authorization error 【发布时间】:2017-02-28 06:54:32 【问题描述】:我可以通过 JGit 从 GitLab 进行克隆,但是当我推送更改时,我收到了 not authorized
错误消息。
三个更重要的细节:
我拥有存储库,因此只读访问不存在问题。
存储库是私有的,所以我知道 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();
【问题讨论】:
你使用哪种协议来克隆和推送? 必须为凭证提供者提供您的真实用户名(即也是 URL 一部分的用户名)。oauth2
是你的真实用户名吗?
问题中的第 3 点表明您没有足够的权限来验证自己的身份以进行推送。
我正在使用 HTTP 协议。我尝试使用我的真实用户名而不是 oauth2
,但这也不起作用。使用我的用户名,我什至无法首先克隆 repo。
@dlamblin 我不确定我是否理解...使用 GitHub 可以正常工作,GitLab 中的 oauth2 令牌有区别吗?
【参考方案1】:
使用下面的 sn-p,我能够从 GitLab 存储库中克隆并推送回 GitLab 存储库。
CredentialsProvider credentialsProvider
= new UsernamePasswordCredentialsProvider( "myname", "password" );
Git git = Git.cloneRepository()
.setURI( "https://gitlab.com/myname/repo.git" )
.setDirectory( tempFolder.newFolder() )
.setCredentialsProvider( credentialsProvider )
.call();
File file = new File( git.getRepository().getWorkTree(), "file" + new Object().hashCode() );
file.createNewFile();
git.add().addFilepattern( file.getName() ).call();
git.commit().setMessage( "Add file " + file.getName() ).call();
git.push()
.setCredentialsProvider( credentialsProvider )
.call();
如果您使用 GitLab 的个人访问令牌,您需要将访问令牌编码到 URL 并作为密码提供,如下所示:
CredentialsProvider credentialsProvider
= new UsernamePasswordCredentialsProvider( "myname", "<token>" );
command.setURI( "https://gitlab-ci-token:<token>@gitlab.com/myname/repo.git" )
command.setCredentialsProvider( credentialsProvider )
也许这将有助于找到“未授权”错误的来源。为了通过 SSH 进行通信,您需要将 SSH 密钥添加到您的 GitLab 配置文件中。
【讨论】:
我想我没有提到这一点,我不会有用户的密码、SSH 密钥,也没有个人访问令牌。我可以访问的唯一信息是用户名和 oauth2 令牌。 @user3817808 你能描述一下 GitLab 的 Web UI 是如何/在哪里管理用户名和 oauth 令牌的,以便我能够重现你的环境吗? 我不知道如何通过 Web UI 获取 oauth 令牌,但我可以按照以下流程获取它:docs.gitlab.com/ce/api/oauth2.html PS 我确实有测试用户的用户名/密码,但对于我的应用程序的所有其他用户,我不会。 感谢您告诉我。根据我的尝试,REST API 的作用与 Profile Settings > Applications 中的 Web UI 相同。我已经发布了你的问题 - 用我自己的话 - to the GitLab forum 我相信您从 UI 获得的只是一个应用程序 ID/秘密。这与 oauth2 令牌不同。查看您的 GitLab 帖子,您应该可以使用git clone https://oauth2:a1b2c3@gitlab.com/user/repo.git
进行克隆,至少我可以。【参考方案2】:
使用个人访问令牌和jgit对gitlab进行身份验证,可以使用如下sn-p:
使用下面的 sn-p,我能够推送回 GitLab 存储库。
CredentialsProvider credentialsProvider = new
UsernamePasswordCredentialsProvider( "PRIVATE-TOKEN", <your oauth token> );
git.push()
.setCredentialsProvider( credentialsProvider )
.call();
这适用于 Jgit 版本 (4.8.0.201706111038-r)
【讨论】:
这应该是公认的答案;效果很好。非常感谢您的分享。【参考方案3】:我正在使用来自 JGit 的 Git.lsRemoteRepository() 方法,使用 OAuth2 访问令牌。
像这样设置 UsernamePasswordCredentialsProvider 实际上对我有用:
LsRemoteCommand cmd = Git.lsRemoteRepository();
cmd.setRemote(cloneUrl);
cmd.setCredentialsProvider(new UsernamePasswordCredentialsProvider("oauth2", gitlab-access-token));
该 url 是一个私有 Gitlab 存储库- https://gitlab.com/my-private-group/testprojectxyxy.git
【讨论】:
以上是关于使用 JGit 授权错误推送到 GitLab的主要内容,如果未能解决你的问题,请参考以下文章
每当我尝试通过 git 推送到远程仓库时都会发生错误。我已经尝试过使用我的 github 和 gitlab 帐户
如何使用 gitlab-ci 作业推送到 gitlab 存储库?
GitLab 错误消息 - 权限被拒绝(公钥) - Bitnami
尝试使用 Gitlab CI 创建 SSH 连接,错误:SSH Permission denied (publickey,password)