Según Eduardo Aquiles, si configura su servidor TeamCity para admitir la autenticación HTTP NTLM (TeamCity 8.x NTLM HTTP Authentication), puede obtener una cookie de sesión (TCSESSIONID) desde la URL /ntlmLogin.html y usar eso para autenticar contra la API REST.
He tenido que hacer algo similar para obtener el estado fijado de compilaciones. Aquí está la PowerShell utilicé:
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;
Nota: No estoy seguro de si esto es apoyado oficialmente por JetBrains, por lo que podría encontrar que se rompe en una versión futura de TeamCity, pero actualmente trabaja en contra de la versión 8.0.2 (compilación 27482).
¿Cómo los mantienes frescos? – abourget
¿Cómo mantenemos la cookie fresca? No estábamos haciendo ninguna conexión a largo plazo con TC, por lo que nunca llegamos al punto en que la cookie ya no era válida. Pero si tuviéramos que hacerlo, necesitaríamos hacer un chequeo, y en el caso de un 401, enviaríamos credenciales nuevamente. Por cierto, no estoy trabajando con TeamCity desde hace 2 años, por lo que no sé si la solución aún se aplica. –