作爲前面問題的後續問題,我問: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工作了兩年,所以我不知道解決方案是否仍然適用。 –