以前の質問のフォローアップとして、TeamCity REST APIでユーザー名とパスワードを渡す方法について、何かを確認したいと思います。
URLでユーザー名とパスワードを渡すのではなく、より安全な方法でTeamCity REST APIにアクセスできるかどうか誰かに教えてもらえますか?
スニファがURLを入手してクレデンシャル自体を使用するのは非常に簡単なので、URLでクレデンシャルを渡すことが唯一の方法であることに私は気が狂っているように見えます。
以前の質問のフォローアップとして、TeamCity REST APIでユーザー名とパスワードを渡す方法について、何かを確認したいと思います。
URLでユーザー名とパスワードを渡すのではなく、より安全な方法でTeamCity REST APIにアクセスできるかどうか誰かに教えてもらえますか?
スニファがURLを入手してクレデンシャル自体を使用するのは非常に簡単なので、URLでクレデンシャルを渡すことが唯一の方法であることに私は気が狂っているように見えます。
私たちは同じ問題に直面し、この問題をどのように解決できるかを時間をかけて調べ、方法を見つけました。
初期画面 (/ntlmLogin.html) で get を実行すると、NTLM を使用してユーザーを識別できるようになります。
次に、TeamCity が提供する Cookie を保存します。
次に、Cookie を使用して API にアクセスします。
これを行う方法の非常に簡単な例でhttps://github.com/eduaquiles/TeamCityNtlmApiWrapperを参照してください。
Eduardo Aquiles によると、HTTP NTLM 認証 ( TeamCity 8.x NTLM HTTP Authentication )をサポートするように TeamCity サーバーを構成すると、/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) に対して動作します。
私はこれについてさらに掘り下げましたが、あまり有望には見えません。
TeamCity コミュニティ フォーラムで次のスレッドを見つけました。
REST API 認証の統合
http://devnet.jetbrains.net/message/5461520#5461520
別のユーザーが私に同様の質問をしたことがあり、応答は基本的な HTTP 認証が現在唯一のオプションであるというものでした。NTLM 認証を使用できますが、これは REST API ではなく、フロント エンド Web UI 向けに調整されています。
REST API 経由で NTLM を使用できるかどうかをフォーラムで質問しました。返信はありませんが、この場合は当然のことながら、それは不可能だと想像できます。