使用REST API登录到服务器的TeamCity没有将凭据传递的网址(Log onto TeamC

2019-07-29 22:09发布

作为后续到以前的问题,我问: 如何在TeamCity的REST API通过用户名和密码 ,我想检查的东西。

谁能告诉我,如果有可能访问一个更安全的方式TeamCity的REST API,而不是通过用户名和密码的网址是什么?

它只是似乎疯了,我认为传递凭据的URL是唯一的方法,因为它是那么容易的嗅探器获得的URL他们的手和使用的凭据自己。

Answer 1:

我们面临着同样的问题,我花了一些时间,看看我们如何能够解决这一问题,并找到了一种方法:

你在初始屏幕(/ntlmLogin.html)的获取 - 你就可以识别使用NTLM用户。
然后你保存的TeamCity提供给您的cookie。
现在,您使用cookie来达到API。

见https://github.com/eduaquiles/TeamCityNtlmApiWrapper就如何做到这一点很简单的例子。



Answer 2:

我已经做了多一些与此周围挖掘,并没有显得过于乐观。

我发现在TeamCity的社区论坛以下主题:

REST API身份验证集成

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

另一位用户问过类似的问题,以挖掘和响应是基本的HTTP认证是目前唯一的选择。 虽然你可以使用NTLM身份验证,即朝向前端的Web UI,而不是REST API定制。

我已要求在论坛上通过REST API使用NTLM是否是可能的。 我已经没有答复,但我可以想像,这是不可能的,这会在这种情况下,可以预期的。



Answer 3:

按照爱德华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)。



文章来源: Log onto TeamCity server using REST API without passing credentials in the url