作为上一个问题的后续,我问:如何在 TeamCity REST API 中传递用户名和密码,我想检查一下。
有人可以告诉我是否可以以更安全的方式访问 TeamCity REST API,而不是在 url 中传递用户名和密码?
在我看来,在 url 中传递凭据是唯一的方法,因为嗅探器很容易拿到 url 并自己使用凭据。
作为上一个问题的后续,我问:如何在 TeamCity REST API 中传递用户名和密码,我想检查一下。
有人可以告诉我是否可以以更安全的方式访问 TeamCity REST API,而不是在 url 中传递用户名和密码?
在我看来,在 url 中传递凭据是唯一的方法,因为嗅探器很容易拿到 url 并自己使用凭据。
我们遇到了同样的问题,我花了一些时间看看我们如何解决这个问题并找到了一种方法:
您进入初始屏幕 (/ntlmLogin.html) - 您将能够使用 NTLM 识别用户。
然后保存 TeamCity 提供给您的 cookie。
现在您使用 cookie 来访问 API。
请参阅https://github.com/eduaquiles/TeamCityNtlmApiWrapper,其中有一个非常简单的示例来说明如何执行此操作。
根据 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)。
我已经对此进行了更多的挖掘,但它看起来不太有希望。
我在 TeamCity 社区论坛上找到了以下主题:
集成了 Rest API 身份验证
http://devnet.jetbrains.net/message/5461520#5461520
另一个用户向我提出了类似的问题,得到的回答是基本的 HTTP 身份验证是目前唯一的选择。虽然您可以使用 NTLM 身份验证,但它是针对前端 Web UI 而不是 REST API 量身定制的。
我在论坛上询问是否可以通过 REST API 使用 NTLM。我没有得到答复,但我可以想象这是不可能的,在这种情况下这是可以预料的。