作为前面问题的后续问题,我问:How to pass username and password in TeamCity REST API,我想检查一些内容。使用REST API登录到TeamCity服务器而不通过URL中的凭证
有人能告诉我是否有可能以更安全的方式访问TeamCity REST API,而不是在URL中传递用户名和密码?
对我来说,在URL中传递凭据是唯一的方法,因为它很容易让嗅探器获得他们的手并使用凭据本身。
作为前面问题的后续问题,我问:How to pass username and password in TeamCity REST API,我想检查一些内容。使用REST API登录到TeamCity服务器而不通过URL中的凭证
有人能告诉我是否有可能以更安全的方式访问TeamCity REST API,而不是在URL中传递用户名和密码?
对我来说,在URL中传递凭据是唯一的方法,因为它很容易让嗅探器获得他们的手并使用凭据本身。
我已经做了一些更多的挖掘,看起来不太有希望。
我发现在TeamCity的社区论坛以下螺纹:
REST API身份验证集成
http://devnet.jetbrains.net/message/5461520#5461520
另一位用户问过类似的问题,以挖掘和响应是基本的HTTP身份验证是目前唯一的选择。虽然您可以使用NTLM身份验证,但这是针对前端Web UI定制的,而不是REST API。
我在论坛上询问是否可以通过REST API使用NTLM。我没有回复,但我可以想象,这是不可能的,在这种情况下,这是可以预料的。
我们面临着同样的问题,我花了一些时间,看看我们如何能够解决这一问题,并找到了一个方法:
你做初始屏幕(/ntlmLogin.html)的获取 - 你会能够识别使用NTLM的用户。
然后你保存TeamCity提供给你的cookie。
现在您使用cookie来访问API。
请参阅https://github.com/eduaquiles/TeamCityNtlmApiWrapper一个非常简单的例子就如何做到这一点。
按照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版本(build 27482)。
感谢您的回答。不幸的是,我不再为在该环境中使用TeamCity的公司工作,所以我可以尝试一下您的建议。不过,我很欣赏你的输入:) –
你如何让它们保持新鲜? – abourget
我们如何保持饼干新鲜? 我们没有和TC进行任何长期的连接,所以我们从来没有意识到cookie不再有效。 但是,如果我们不得不做,我们需要做一个检查,而在401的情况下,我们会再次发送凭证。 顺便说一句,我现在不用TeamCity工作了两年,所以我不知道解决方案是否仍然适用。 –