2016-10-18 2 views
2

Я могу клонировать из GitLab через JGit, но когда я иду нажимать изменения, я получаю сообщение об ошибке not authorized.Push to GitLab с ошибкой авторизации JGit

еще три важные детали:

  1. У меня есть хранилище, так что это не проблема с доступом только для чтения.

  2. Репозиторий закрыт, поэтому я знаю, что токен OAuth 2 действителен и используется в начальном клоне.

  3. У меня ТОЛЬКО есть имя пользователя и токен 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(); 
+0

Какой протокол вы используете для клонирования и нажать? –

+0

Поставщику учетных данных должно быть предоставлено ваше реальное имя пользователя (то есть тот, который также является частью URL-адреса). Является ли 'oauth2' вашим реальным именем пользователя? –

+0

Пункт 3 в вашем вопросе указывает, что вам недостаточно, чтобы пройти аутентификацию себя для толчка. – dlamblin

ответ

2

С ниже фрагмент кода, я смог клонировать от и оттеснить к репозиторий 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.

+0

Думаю, я не упоминал об этом, у меня не будет пароля для пользователя, SSH-ключа и персонального токена доступа. Единственная информация, к которой у меня есть доступ, - это имя пользователя и токен oauth2. – user3817808

+0

@ user3817808 Можете ли вы описать, как/где веб-интерфейс GitLab используется для управления именем пользователя и маркером oauth, чтобы я мог воспроизводить вашу среду? –

+0

Я не знаю, как получить токен oauth через веб-интерфейс, но я могу получить его после этого потока: https://docs.gitlab.com/ce/api/oauth2.html PS У меня есть имя пользователя/пароль тестового пользователя, но для всех других пользователей моего приложения я не буду. – user3817808

0

Для аутентификации gitlab используя персональный маркер доступа и jgit, вы можете использовать следующий фрагмент кода:

С ниже фрагмент кода, я был в состоянии оттеснить в хранилище GitLab.

CredentialsProvider credentialsProvider = new 
    UsernamePasswordCredentialsProvider("PRIVATE-TOKEN", <your oauth token>); 
git.push() 
    .setCredentialsProvider(credentialsProvider) 
    .call(); 

Это работает в версии Jgit (4.8.0.201706111038-р)

Смежные вопросы