Авторизуйтесь с помощью клиентской веб-части Sharepoint - PullRequest
0 голосов
/ 01 апреля 2020

У меня возникла проблема при входе в Jenkins с помощью веб-части клиента Sharepoint.

Безопасность на стороне Jenkins: с помощью плагина Azure AD пользователь теперь может войти с использованием учетных данных Office 365.

В облаке: Создана регистрация приложения с URI перенаправления в виде - https: // {JenkinsDomain} / securityRealm / finishLogin

Теперь я создаю клиентскую веб-часть и пытаюсь получить доступ к URL-адресу - https: /// api / json? tree = jobs [name, color] из веб-части, там написано «Ошибка 403 - запрещено», хотя, когда я пробую тот же URL из новой вкладки, он дает мне ответ.

Вещи, которые я пробовал:

const msalConfig = {
  auth: {
    clientId: "api://<client>/",
    // authority: "https://login.microsoftonline.com/common",
    authority : "https://login.microsoftonline.com/<tenantID>/",
    scopes: ['https://graph.windows.net/Directory.Read.All'],
    redirectUri : 'https://<tenantName>.sharepoint.com/'
  }
};
var userAgentApplication = new Msal.UserAgentApplication(msalConfig)

userAgentApplication.loginPopup().then(function (id_token) {
  console.log(id_token);
  var user = userAgentApplication.getAccount();
  console.log(user);
  if (user) {

  }
})

Этот код выдает мне ошибку:

AADSTS50011: URL-адрес ответа, указанный в запросе, не соответствует ответу URL-адреса, настроенные для приложения: 'api: // {clientID} /'.

Можно ли каким-либо образом получить доступ к API Jenkins при включенном Azure AD через клиентскую веб-часть? Любая помощь приветствуется. Спасибо

1 Ответ

1 голос
/ 01 апреля 2020

Ниже приведены шаги, которые мы выполняем для вызова Jenkins REST API из кода, будь то Javascript / Java.

  1. Войдите на сервер Jenkins с помощью единого входа или Вход в Jenkins (В вашем случае ваша AD будет аутентифицировать вас и переместит вас на домашнюю страницу)
  2. После входа в систему go для управления пользователями
  3. В управлении пользователями, либо для Выбранный пользователь или для супер администратора, мы должны выбрать настройки, которые переходят на страницу сведений о пользователе. Обычно у нас есть пользователь-администратор, для которого мы настраиваем токены.
  4. На этой странице мы должны предоставить имя токена и сгенерировать новый токен.
  5. Этот токен необходимо скопировать и поместите его в безопасное место
  6. После этого сохраните профиль
  7. Теперь из кода javascript / java используйте формат токена usename: token и получите строка base64 этого значения. Пример java фрагмент кода приведен ниже

    String secureToken = Base64.getEncoder (). EncodeToString ((user + ":" + key) .getBytes ());

  8. После этого установите secureToken в заголовке Authorization, как показано ниже для Java

    httpGet.setHeader (HttpHeaders.AUTHORIZATION, "Basi c" + secureToken);

  9. Теперь с помощью этого подхода вы можете выполнять вызовы API-интерфейса Jenkins REST, например, получать статистику сборки, запускать сборку et c.

Я соберу несколько полезных ссылок от Дженкинса и пост для дальнейшего чтения, потому что токены безопасности должны быть безопасно использованы, и их нужно повернуть через некоторое время по соображениям безопасности (поскольку это сделает этот пост очень длинным, я пропускаю эти пункты здесь).

У меня есть ссылки ниже, которые дадут более подробную информацию

https://wiki.jenkins.io/display/JENKINS/Remote+access+API

https://www.decodingdevops.com/jenkins-authentication-token-jenkins-rest-api/

Кроме того, я получил этот код, который мы долго использовали для node.js, чтобы поговорить с Дженкинсом, надеюсь, что это может быть полезно для вас

const options = {
    hostname: process.env.JENKINS_HOST,
    port: process.env.JENKINS_PORT,
    path: `${jenkinsBuildUrl}?param1=${param1}&param2=${params.Key}&operation=${operation}`,
    method: "POST",
    headers: {
        'Authorization': 'Basic '+ Buffer.from('admin'+':'+process.env.AUTH_TOKEN).toString('base64')
    }
};

const jr = https.request(options, jres => {
    jres.on("data", chunk => {
        console.log(`BODY: ${chunk}`);
    });
    jres.on("end", () => {
        console.log("Request completed with no data.");
    });
});
jr.on("error", e => {
    console.log(
        `Something went wrong when triggering the build in Jenkins Server in the current request: ${e.message}`
    );
});
jr.end();

HTH

...