作为对上一个问题的跟进,我问:How to pass username and password in TeamCity REST API,我想检查一下。
有人能告诉我是否可以更安全的方式访问TeamCity REST API,而不是在网址中传递用户名和密码?
对我而言,在网址中传递凭据是唯一的方法,因为嗅探器很容易获取网址并自行使用凭据,这似乎很疯狂。
答案 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)。