2012-08-08 54 views
11

を使用して、私はJIRAのREST APIにログインするためにC#のコードの下に書いている:私はこれを実行するとJIRA休憩APIログインC#

var url = new Uri("http://localhost:8090/rest/auth/latest/session?os_username=tempusername&os_password=temppwd"); 
var request = WebRequest.Create(url) as HttpWebRequest; 
if (null == request) 
{ 
return ""; 
} 
request.Method = "POST"; 
request.ContentType = "application/json"; 
request.ContentLength = 200; 
request.KeepAlive = false; 
using (var response = request.GetResponse() as HttpWebResponse) 
{ 
} 

、アプリケーションはただの応答を返さずに実行しているになります。これがREST APIを使用したJIRAログインの正しい方法であるかどうかをご提案ください

+0

なぜContentTypeとContentLengthが指定されていますか?あなたのコードに実際のコンテンツ/ボディが含まれているとは思われません。 – Pete

+0

応答なしで返信すると、request.GetResponse()が例外をスローしますか? Webサーバーから少なくとも何らかの応答があるはずです。 – Joppe

答えて

29

基本認証では、ユーザー名とパスワードをbase64エンコーディングで送信する必要があります。ガイドラインは、アトラシアン社員開発者のページ上のAPIの例で見つけることができます: https://developer.atlassian.com/display/JIRADEV/JIRA+REST+API+Example+-+Basic+Authentication 、あなたがC#でそれをやっている場合は、次の形式でヘッダー内の符号化データを送信する必要があります。

「認可:基本[ENCODED CREDENTIALS]」ここ

は簡単な例です:

public enum JiraResource 
{ 
    project 
} 

protected string RunQuery(
    JiraResource resource, 
    string argument = null, 
    string data = null, 
    string method = "GET") 
{ 
    string url = string.Format("{0}{1}/", m_BaseUrl, resource.ToString()); 

    if (argument != null) 
    { 
     url = string.Format("{0}{1}/", url, argument); 
    } 

    HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; 
    request.ContentType = "application/json"; 
    request.Method = method; 

    if (data != null) 
    { 
     using (StreamWriter writer = new StreamWriter(request.GetRequestStream())) 
     { 
      writer.Write(data); 
     } 
    } 

    string base64Credentials = GetEncodedCredentials(); 
    request.Headers.Add("Authorization", "Basic " + base64Credentials); 

    HttpWebResponse response = request.GetResponse() as HttpWebResponse; 

    string result = string.Empty; 
    using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
    { 
     result = reader.ReadToEnd(); 
    } 

    return result; 
} 

private string GetEncodedCredentials() 
{ 
    string mergedCredentials = string.Format("{0}:{1}", m_Username, m_Password); 
    byte[] byteCredentials = UTF8Encoding.UTF8.GetBytes(mergedCredentials); 
    return Convert.ToBase64String(byteCredentials); 
} 

0(JiraResourceは、私が使用するAPIのどの部分かを決定するために使用するだけの列挙型です)

こちらがお役に立てば幸いです。ここで

+2

これは答えとして受け入れられるべきです。私はそれを試して、それは動作します。 – EvAlex

+0

おかげでたくさんの男、これは私に大きな時間を助けた! – jfplataroti

+0

このソリューションは、WCFサービスを使用して接続しようとすると機能しません。 – AskMe

2

は、必要に応じて動作するシンプルなソリューションです:あなたがここにすべての要求に資格情報をエンコードしたくない場合は

var mergedCredentials = string.Format("{0}:{1}", username, password); 
var byteCredentials = Encoding.UTF8.GetBytes(mergedCredentials); 
var encodedCredentials = Convert.ToBase64String(byteCredentials); 

using (WebClient webClient = new WebClient()) 
{ 
    webClient.Headers.Set("Authorization", "Basic " + encodedCredentials); 

    return webClient.DownloadString(url); 
} 
1

クッキーを使用してそれを行う方法です。

Cookieをリクエストする際に、ヘッダに承認を追加する必要はありません。このメソッドは、ユーザー名とパスワードとURLを含むJSON文字列を受け入れます。クッキーの値を返します。

public async Task<JiraCookie> GetCookieAsync(string myJsonUserNamePassword, string JiraCookieEndpointUrl) 
{ 
    using (var client = new HttpClient()) 
     { 
      var response = await client.PostAsync(
       JiraCookieEndpointUrl, 
       new StringContent(myJsonUserNamePassword, Encoding.UTF8, "application/json")); 
      var json = response.Content.ReadAsStringAsync().Result; 
       var jiraCookie= JsonConvert.DeserializeObject<JiraCookie>(json); 
       return jArr; 
     } 
} 

public class JiraCookie 
{ 
    public Session session { get; set; } 
} 

public class Session 
{ 
    public string name { get; set; } 
    public string value { get; set; } 
} 

私はURLを使用し、それを呼び出す:http://[baseJiraUrl]/rest/auth/1/sessionそれには、次のJSONレスポンスを返す:

{ 
"session" : -{ 
"name" : JSESSIONID, 
"value" : cookieValue 
} 

は、上記のURLは、私が使っていると異なる場合がありJIRAのバージョンで有効です覚えておいてください使用しているバージョン。使用しているバージョンの正しいURLについては、JIRA APIのドキュメントを参照してください。私は以下を使用しています: https://docs.atlassian.com/software/jira/docs/api/REST/7.6.1/#auth/1/session

あなたのクッキーを保存し、それ以降のすべてのリクエストで使用する必要があります。 HttpClientリクエストにCookieを追加する方法については、How do I set a cookie on HttpClient's HttpRequestMessageをご覧ください。

Cookieが終了したら(ログアウト)、投稿と同じURLの削除HTTPリクエストを送信するだけです。