2012-06-13 87 views

回答

2

我已經做了一些更多的挖掘,看起來不太有希望。

我發現在TeamCity的社區論壇以下螺紋:

REST API身份驗證集成

http://devnet.jetbrains.net/message/5461520#5461520

另一位用戶問過類似的問題,以挖掘和響應是基本的HTTP身份驗證是目前唯一的選擇。雖然您可以使用NTLM身份驗證,但這是針對前端Web UI定製的,而不是REST API。

我在論壇上詢問是否可以通過REST API使用NTLM。我沒有回覆,但我可以想象,這是不可能的,在這種情況下,這是可以預料的。

8

我們面臨着同樣的問題,我花了一些時間,看看我們如何能夠解決這一問題,並找到了一個方法:

你做初始屏幕(/ntlmLogin.html)的獲取 - 你會能夠識別使用NTLM的用戶。
然後你保存TeamCity提供給你的cookie。
現在您使用cookie來訪問API。

請參閱https://github.com/eduaquiles/TeamCityNtlmApiWrapper一個非常簡單的例子就如何做到這一點。

+0

你如何讓它們保持新鮮? – abourget

+0

我們如何保持餅乾新鮮? 我們沒有和TC進行任何長期的連接,所以我們從來沒有意識到cookie不再有效。 但是,如果我們不得不做,我們需要做一個檢查,而在401的情況下,我們會再次發送憑證。 順便說一句,我現在不用TeamCity工作了兩年,所以我不知道解決方案是否仍然適用。 –

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版本(build 27482)。

+0

感謝您的回答。不幸的是,我不再爲在該環境中使用TeamCity的公司工作,所以我可以嘗試一下您的建議。不過,我很欣賞你的輸入:) –

相關問題