指定登录详细信息时,C#RestClient返回“需要登录”

问题描述 投票:0回答:2

刚开始在一家新公司开始我们都使用Jira,客户决心不使用它,因为他们不喜欢它所以我决定构建一个简单的Windows窗体,当他们既可以记录门票又可以获得更新和评论。很简单的UI。

现在我在2周之前从未做过任何编码,因此我很难理解C#和Rest(已经制作了基本IT修复的脚本,但从来没有像这样复杂!)

回到点,设置并使用Rest Client设置Rest API,但每次我尝试从Jira上的票据中提取数据时,我都会收到错误:

{“errorMessages”:[“您无权查看指定的问题。”,“需要登录”],“错误”:{}}

以下是表单中的代码:

private void button3_Click_1(object sender, EventArgs e)
        {
            var client = new RestClient("https://jira.eandl.co.uk/rest/api/2/issue/ITREQ-" + textBox1.Text
);
            client.Authenticator = new SimpleAuthenticator("username", "abc", "password", "123");

            var request = new RestRequest(Method.GET);

            request.AddParameter("token", "saga001", ParameterType.UrlSegment);

            // request.AddUrlSegment("token", "saga001"); 

            request.OnBeforeDeserialization = resp => { resp.ContentType = "application/json"; };

            var queryResult = client.Execute(request);

            Console.WriteLine(queryResult.Content);
        }

这是来自Rest Client本身的代码:

public Restclient()
        {
            endPoint = string.Empty;
            httpMethod = httpVerb.GET;
        }

        private string logonAttempt;



        public string makeRequest()
        {
            string strResponseValue = string.Empty;

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(endPoint);

            request.Method = httpMethod.ToString();

            String authHeader = System.Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(userName + ":" + userPassword));
            request.Headers.Add("Authorization", authType.ToString() + " " + authHeader);

            HttpWebResponse response = null;

            try
            {
                response = (HttpWebResponse)request.GetResponse();

                //Process the Response Stream... (Could be JSON, XML ot HTML etc...)

                using (Stream responseStream = response.GetResponseStream())
                {
                    if (responseStream != null)
                    {
                        using (StreamReader reader = new StreamReader(responseStream))
                        {
                            strResponseValue = reader.ReadToEnd();
                        }//End of Stream Reader
                    }
                }//end of Response Stream
            }
            catch (Exception ex)
            {
                strResponseValue = "(\"errorMessages\":[\"" + ex.Message.ToString() + "\"],\"errors\":{}}";
            }
            finally
            {
                if(response != null)
                {
                    ((IDisposable)response).Dispose();
                }
            }

            return strResponseValue;
        }
    }
}

现在显然我期待我错过了一些像我说的那样绝对比较大的东西,我以前从未接受过这样的项目并且有过0次经验。

只是找人直截了当地告诉我我做错了什么

根据答案改为:

private void button3_Click_1(object sender, EventArgs e)
    {
        var client = new 
RestClient("https://jira.eandl.co.uk/rest/api/2/issue/ITREQ-" + textBox1.Text
);
        client.Authenticator = new HttpBasicAuthenticator("username", "password");

        var request = new RestRequest(Method.GET);

        string authHeader = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes("cdale!" + ":" + "Chantelle95!"));
        request.AddHeader("Authorization", "Basic " + authHeader);

        request.OnBeforeDeserialization = resp => { resp.ContentType = "application/json"; };

        var queryResult = client.Execute(request);

        Console.WriteLine(queryResult.Content);
    }
c# rest jira-rest-api
2个回答
1
投票

默认情况下,使用Jira REST API,您可以使用基本身份验证或OAuth2。我认为更简单的方法是使用Basic。

我不确定为什么你有一个定义自定义RestClient的类,因为第一个代码块使用了http://restsharp.org中的RestSharp。

在这种情况下,您需要修改验证器:

client.Authenticator = new HttpBasicAuthenticator(userName, password);

而且我认为您应该删除指定token的行。我不认为这是必需的。

最后,似乎没有使用类Restclient,然后删除它。

您还可以使用在自定义RestClient中创建的内容并手动指定Basic标头:

string authHeader = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(userName + ":" + userPassword));
request.AddHeader("Authorization", "Basic " + authHeader);

然而,它本质上是HttpBasicAuthenticator类的行为。


0
投票

如果您不想在每个请求中对您的凭据进行编码,那么如何使用cookie进行编码。

请求cookie时,您无需在标头上添加任何授权。此方法将接受带有用户名和密码以及URL的JSON字符串。它将返回cookie值。

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版本中有效,可能会根据您使用的版本而有所不同。阅读JIRA API文档,了解您使用的版本的正确URL。我正在使用以下内容:https://docs.atlassian.com/software/jira/docs/api/REST/7.6.1/#auth/1/session

请记住,您必须存储您的cookie并在每个后续请求中使用它。查看有关如何在您的HttpClient请求中添加cookie的答案:How do I set a cookie on HttpClient's HttpRequestMessage

一旦你完成了cookie(注销),只需发送一个删除http请求,其URL与帖子相同。

参考:https://stackoverflow.com/a/49109192/7763903

© www.soinside.com 2019 - 2024. All rights reserved.