使用REST API登录TeamCity服务器,而不在URL中传递凭据

时间:2012-06-13 17:20:16

标签: security rest teamcity

作为对上一个问题的跟进,我问:How to pass username and password in TeamCity REST API,我想检查一下。

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

对我而言,在网址中传递凭据是唯一的方法,因为嗅探器很容易获取网址并自行使用凭据,这似乎很疯狂。

3 个答案:

答案 0 :(得分:8)

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

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

请参阅https://github.com/eduaquiles/TeamCityNtlmApiWrapper,其中包含一个非常简单的示例。

答案 1 :(得分:2)

我已经做了一些更多的探索,看起来并不太有希望。

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

Rest API身份验证集成

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

另一位用户向我提出了类似的问题并且回复是基本的HTTP身份验证是目前唯一的选择。虽然您可以使用NTLM身份验证,但这是针对前端Web UI而不是REST API。

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

答案 2 :(得分:2)

根据Eduardo Aquiles的说法,如果您将TeamCity服务器配置为支持HTTP NTLM身份验证(TeamCity 8.x NTLM HTTP Authentication),则可以从/ntlmLogin.html网址获取会话cookie(TCSESSIONID)并使用该cookie进行身份验证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)。