5

作为上一个问题的后续,我问:如何在 TeamCity REST API 中传递用户名和密码,我想检查一下。

有人可以告诉我是否可以以更安全的方式访问 TeamCity REST API,而不是在 url 中传递用户名和密码?

在我看来,在 url 中传递凭据是唯一的方法,因为嗅探器很容易拿到 url 并自己使用凭据。

4

3 回答 3

8

我们遇到了同样的问题,我花了一些时间看看我们如何解决这个问题并找到了一种方法:

您进入初始屏幕 (/ntlmLogin.html) - 您将能够使用 NTLM 识别用户。
然后保存 TeamCity 提供给您的 cookie。
现在您使用 cookie 来访问 API。

请参阅https://github.com/eduaquiles/TeamCityNtlmApiWrapper,其中有一个非常简单的示例来说明如何执行此操作。

于 2012-12-01T17:46:28.937 回答
2

根据 Eduardo Aquiles,如果您将 TeamCity 服务器配置为支持 HTTP NTLM 身份验证(TeamCity 8.x NTLM HTTP 身份验证),您可以从 /ntlmLogin.html url 获取会话 cookie (TCSESSIONID) 并使用它来针对 REST 进行身份验证API。

我只需要做一些类似的事情来获得构建的固定状态。这是我使用的 PowerShell:

function Get-TeamCityNtlmAuthCookie()
{
    param( [string] $serverUrl )
    $url = "$serverUrl/ntlmLogin.html";
    $cookies = new-object System.Net.CookieContainer;
    $request = [System.Net.WebRequest]::Create($url);
    $request.CookieContainer = $cookies;
    $request.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials;
    $request.PreAuthenticate = $true;
    $response = $request.GetResponse();
    return $cookies;
}

function Get-TeamCityBuildPinnedState()
{
    param( [string] $serverUrl, [string] $buildTypeId)
    # get a session cookie to use with the rest api
    $cookies = Get-TeamCityNtlmAuthCookie $serverUrl;
    # query the rest api using the session cookie for authentication
    $url = "$serverUrl/httpAuth/app/rest/builds/id:$buildTypeId/pin/";
    $request = [System.Net.WebRequest]::Create($url);
    $request.CookieContainer = $cookies;
    $response = $request.GetResponse();
    $stream = $response.GetResponseStream();
    $reader = new-object System.IO.StreamReader($stream);
    $text = $reader.ReadToEnd();
    $reader.Close();
    return [bool]::Parse($text);
}

$myServerUrl = "http://myTeamCityServer";
$myBuildId = "6";

$pinned = Get-TeamCityBuildPinnedState $myServerUrl $myBuildId;
write-host $pinned;

注意:我不确定 JetBrains 是否正式支持此功能,因此您可能会发现它在 TeamCity 的未来版本中中断,但它目前适用于版本 8.0.2(内部版本 27482)。

于 2014-01-03T12:43:12.627 回答
2

我已经对此进行了更多的挖掘,但它看起来不太有希望。

我在 TeamCity 社区论坛上找到了以下主题:

集成了 Rest API 身份验证

http://devnet.jetbrains.net/message/5461520#5461520

另一个用户向我提出了类似的问题,得到的回答是基本的 HTTP 身份验证是目前唯一的选择。虽然您可以使用 NTLM 身份验证,但它是针对前端 Web UI 而不是 REST API 量身定制的。

我在论坛上询问是否可以通过 REST API 使用 NTLM。我没有得到答复,但我可以想象这是不可能的,在这种情况下这是可以预料的。

于 2012-06-14T08:27:53.063 回答