gpt4 book ai didi

.net - 在 .NET/F 中将 OAuth 与 Jira REST 调用结合使用#

转载 作者:行者123 更新时间:2023-12-02 14:23:41 25 4
gpt4 key购买 nike

我正在尝试在 F# 中创建一个 .NET 应用程序,该应用程序调用 Jira REST API 来读取/创建问题。

我使用 OpenSSL 生成了 .pub.pem,并使用公钥在 Jira 中创建了应用程序链接。

这是我组合在一起的签名函数(基于我在博客文章中找到的一些 C# 代码),它可以让我获得初始 token 响应:

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")

这成功返回了 token 信息,但我不确定获得 token 后下一步该做什么。我基于此的原始 C# 代码使用 HMACSHA1 而不是 RSASHA1,并简单地将消费者 secret 与 token secret 连接起来,然后再次调用签名函数。

我无法让这个工作以这种方式进行。我必须将 .pem 文件中的私钥转换为 XML,以便将其读入 RSACryptoServiceProvider。如果我在转换之前尝试将 token secret 连接到私钥上,则会收到错误。

如何签署 token key ,以便我可以对 Jira 进行后续 REST 调用?

最佳答案

这可能不是您想要的答案,但我做了一些接近您需要的事情。我没有使用“普通”身份验证(通过 JSON)之外的任何其他内容,但是当我进行身份验证时,我再次重用 session 变量 JSESSIONID (cookie)。

如果这对您有用(您的身份验证,然后获取 JSESSIONID,然后重用它),那么以下代码应该可以工作(作为原则)。

请注意,我正在使用 FSharp.Data <package id="FSharp.Data" version="2.3.1" targetFramework="net46" />也许还有一些“ friend ”(一些其他包依赖项)在同一运行中。

另请注意,我正在引用一个文件来获取查询返回的 JSON,因此,如果您要使用 JSON 提供程序并进行搜索或类似操作,则需要一些 JSON 来推断搜索结果来自。

希望代码能给您一些指导。

是的,这段代码可能不是 F# 的最佳时刻;-)

#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)

关于.net - 在 .NET/F 中将 OAuth 与 Jira REST 调用结合使用#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40092977/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com