2012-06-13 38 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的公司工作,所以我可以尝试一下您的建议。不过,我很欣赏你的输入:) –

相关问题