2016-10-17 12 views
4

問題を読み書きするためにJira REST APIを呼び出すF#で.NETアプリケーションを作成しようとしています。.NET/FでJira REST呼び出しでOAuthを使用する#

OpenSSLで.pub.pemを生成し、公開鍵でJiraにアプリケーションリンクを作成しました。ここで

は私の最初のトークンの応答を取得します(私はブログの記事で見つかったいくつかのC#コードのオフに基づいて)私は一緒に入れて署名機能である:

let rsasha1 (signingKey : string) str = 
    let rsa = new RSACryptoServiceProvider() 
    rsa.FromXmlString(signingKey) 
    let shaHashObject = new SHA1Managed() 
    let data = Encoding.ASCII.GetBytes(str : string) 
    let hash = shaHashObject.ComputeHash(data) 
    let signedValue = rsa.SignHash(hash, CryptoConfig.MapNameToOID("SHA1")) 
    Convert.ToBase64String(signedValue, Base64FormattingOptions.None) 

そして、これは私が「関数であります(また、オンラインスニペットから見つかっ)コール

/// Request a token and return: 
/// oauth_token, oauth_token_secret, oauth_callback_confirmed 
let requestToken() = 

    let queryParameters = 
     ["oauth_callback", "oob" 
     "oauth_consumer_key", consumerKey 
     "oauth_nonce", System.Guid.NewGuid().ToString().Substring(24) 
     "oauth_signature_method", "RSA-SHA1" 
     "oauth_timestamp", currentUnixTime().ToString() 
     "oauth_version", "1.0"] 

    let signingString = baseString "POST" requestTokenURI queryParameters 

    let rsaSignature = rsasha1 consumerSecretXML signingString 

    let realQueryParameters = ("oauth_signature", rsaSignature)::queryParameters 

    let req = WebRequest.Create(requestTokenURI, Method="POST") 
    let headerValue = createAuthorizeHeader realQueryParameters 
    req.Headers.Add(HttpRequestHeader.Authorization, headerValue) 

    let resp = req.GetResponse() 
    let stream = resp.GetResponseStream() 
    let txt = (new StreamReader(stream)).ReadToEnd() 

    let parts = txt.Split('&') 
    (parts.[0].Split('=').[1], 
    parts.[1].Split('=').[1], 
    parts.[2].Split('=').[1] = "true") 

これが正常にトークン情報を返しますが、私はトークンを持っていたら、次に何をすべきかわからない午前を行うために使用してメートル。これを基にした元のC#コードでは、RSASHA1の代わりにHMACSHA1を使用していましたが、コンシューマーシークレットとトークンシークレットを連結してから、署名関数を再度呼び出しました。

私はこのように動作することができません。 .pemファイルの秘密鍵をXMLに変換してRSACryptoServiceProviderに読み込まなければなりませんでした。トークン・シークレットを変換前に秘密鍵に連結しようとすると、エラーが発生します。

Jiraへの後続のREST呼び出しを行うためにトークンシークレットに署名するにはどうすればよいですか?

+0

リクエストでセッションクッキーを使用するセッションを作成したので、それ以降のすべてのリクエストでクッキーを設定するだけです。 セッションオブジェクトをクライアントに格納します。これを行う方法は、クライアントの実装方法によって異なります。 リクエストを行う場合は、セッションからCookieの名前と値を取得し、リクエストのヘッダーに「Cookie」フィールドを設定するために使用します。 ヘッダー:{cookie:JSESSIONID = 6E3487971234567896704A9EB4AE501F} –

+0

Sergey Tihon [Twitterに掲載](https://twitter.com/sergey_tihon/status/788240599686213633):[Atlassian.SDK]( https://www.nuget.org/packages/Atlassian.SDK/)。 –

答えて

1

の最高の瞬間ではなく、ヘルゲの答えは、私たちが偽の伐採することができました@触発さユーザーがやる方法。

#r "System.Net.Http" 

open System 
open System.Collections.Generic 
open System.Net 
open System.Net.Http 
open System.Net.Http.Headers 

let toKVPairSeq l = 
    Seq.map (fun (k, v) -> KeyValuePair(k, v)) l 

let handler = new HttpClientHandler() 
let client = new HttpClient(handler) 
client.BaseAddress <- Uri "http://jira/" 
let authRequestContent = new FormUrlEncodedContent([ 
                 "os_username", "jira-user" 
                 "os_password", "jira-password" 
                 "os_cookie", "true" 
                 "os_destination", "" 
                 "user_role", "" 
                 "atl_token", "" 
                 "login", "Log+In" 
                ] |> toKVPairSeq) 
let request = new HttpRequestMessage() 
let result1 = client.PostAsync("login.jsp", authRequestContent).Result 
result1.EnsureSuccessStatusCode() 
printf "%A %s" result1.StatusCode <| result1.Content.ReadAsStringAsync().Result 
let result2 = (client.GetAsync "rest/api/latest/issue/ISSUE-1").Result 
printf "%A %s" result2.StatusCode <| result2.Content.ReadAsStringAsync().Result 
2

これはおそらくあなたが望む答えではありませんが、私はあなたが必要とするものに近い何かをしました。私はJSONによる "普通の"認証を使用していませんが、私が認証されたときにセッション変数JSESSIONID(cookie)を再利用しています。

これはあなたの認証(あなたの認証、そしてJSESSIONIDを取得して再利用する)の場合、以下のコードは(原則として)ある種の仕事をするべきです。

同じ実行でFSharp.Data <package id="FSharp.Data" version="2.3.1" targetFramework="net46" />といくつかの "友人"(他のパッケージの依存関係)を使用していることを心配してください。

返されたJSONのファイルを参照していますので、JSONプロバイダを使用して検索などを行う場合は、JSONを検索する必要があります生じる。

このコードでは、いくつかの参考になると思います。

そして、はい、このコードはおそらく、F#の;-)私たちは、のOAuth作業を取得できませんでし

#r "System.Servicemodel" 
#r "System.Xml" 
#r @"..\packages\FSharp.Data.2.3.1\lib\net40\fsharp.data.dll" 

open FSharp.Data 
[<Literal>] 
let baseUrl = "https://jira" 

[<Literal>] 
let jiraUrlQuery = baseUrl + "/rest/api/2/search?jql=text%20~%20%22some text%22%20ORDER%20BY%20created%20DESC" 

[<Literal>] 
let loginUrl = "/rest/auth/1/session" 

//[<Literal>] 
let creds = sprintf "{\"username\": \"%s\", \"password\": \"%s\" }" 

[<Literal>] 
let loginInfoExample = "{\"session\":{\"name\":\"JSESSIONID\",\"value\":\"åæø8F95074F7398C68961708066EC6342A8\"},\"loginInfo\":{\"failedLoginCount\":7,\"loginCount\":434,\"lastFailedLoginTime\":\"2016-08-02T13:15:27.392+0200\",\"previousLoginTime\":\"2016-08-05T08:46:45.168+0200\"}}" 

type LoginInfo = JsonProvider<loginInfoExample> 

let login = Http.Request(baseUrl+loginUrl, httpMethod="POST", body=HttpRequestBody.TextRequest(creds "SomeUserName" "SomePassword"), headers= [ "Content-Type", "application/json" ]) 
//let login = JsonValue.Request(baseUrl+loginUrl, httpMethod="POST", headers= [ "Content-Type", "application/json" ]) 

let getText = 
    function 
    | Text s -> s 
    | _ -> "" 

let loggedIn = LoginInfo.Parse(getText login.Body).Session.Value.ToString() 

type JiraIssues = JsonProvider< ".\JIRA\query.json" > //jiraUrlQuery> 

let listOfCases = JiraIssues.Parse(Http.Request(jiraUrlQuery, cookies=["JSESSIONID", loggedIn]).Body |> getText) 

listOfCases.Issues |> Seq.map (fun x -> x.Fields.Summary, x.Fields.Created) |> Seq.sortByDescending (fun (s,c) -> c) |> Seq.iter (fun (s,c) -> printfn "%A: %s" c s) 
+0

これはJIRAの最新バージョンで、アプリの基本認証をサポートしていませんか? –

+0

おそらくそうではありません。しかし、それはどこかにoauthトークンを返すことで "同じ原則"であり、どこかは通常、ある種のクッキーです。 –

関連する問題