如何通过REST api发送身份验证cookie WebRequest并在JIRA中接收响应?

时间:2014-11-10 08:43:26

标签: rest authorization jira webrequest jira-rest-api

所有

我正在研究JIRA,我正在从saparate代码发送身份验证请求,我正在收到响应,之后我需要从JIRA获取所有问题,而不是我发送请求的时间我得到401(未经授权) )当我使用gZip压缩发送相同的用户名和密码时。 我的第一个请求代码正在跟随我从哪里获得经过身份验证的正确响应。

string urll = ConfigurationManager.AppSettings["globalUrlForLP"];
HttpWebRequest request;
WebResponse response;
String uri;
LpResponse lp_response;
uri = urll + url;
request = WebRequest.Create(uri) as HttpWebRequest;
request.Credentials = CredentialCache.DefaultCredentials;
request.Method = verb;
request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
request.Headers.Set("Authorization", Convert.ToBase64String(Encoding.ASCII.GetBytes(this.Username + ":" + this._password)));

if (null != data)
{
    request.ContentType = "application/json";
    String jsonPayload = JsonConvert.SerializeObject(data);
    byte[] jsonPayloadByteArray = Encoding.ASCII.GetBytes(jsonPayload.ToCharArray());
    request.GetRequestStream().Write(jsonPayloadByteArray, 0, jsonPayloadByteArray.Length);
}
lp_response = new LpResponse();
try
{
     response = request.GetResponse();
     StreamReader reader = new StreamReader(response.GetResponseStream());
     lp_response.response = reader.ReadToEnd();
}
catch (Exception e)
{
     lp_response.error = e;
}
return lp_response;
}

从中我得到的反应如下。

{
  "session": {
  "name": "JSESSIONID",
  "value": "12345678901234567890"
  },
    "loginInfo": {
    "failedLoginCount": 10,
    "loginCount": 127,
    "lastFailedLoginTime": "2014-10-28T06:52:52.211+0000",
    "previousLoginTime": "2014-10-28T06:52:52.211+0000"
     }
}

现在来到这一点,我想从JIRA得到所有项目,因为我写了下面的代码,我来到这里401 Unathorized。得到这个后,我阅读了JIRA REST Api文档,在那里我找到了以下内容。

"如果呼叫者经过身份验证,则返回有关呼叫者会话的信息。 请注意,响应包含调用方必须遵守的Set-Cookie HTTP标头。如果您使用的是cookie HTTP客户端然后它将自动处理所有Set-Cookie标头。这很重要,因为单独设置JSESSIONID cookie可能 不足以使身份验证工作。"

所以请用以下代码建议我需要做些什么?

我的失败代码正在关注。

string url = ConfigurationManager.AppSettings["urlAllJiraProject"];
LpResponse res = new LpResponse();
HttpWebRequest request;
WebResponse response;
List<AllJiraProject> jiraproject = new List<AllJiraProject>();
request = WebRequest.Create(url) as HttpWebRequest;
request.Credentials = CredentialCache.DefaultCredentials;
request.Method = "GET";
request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
request.Headers.Set("Authorization", Convert.ToBase64String(Encoding.ASCII.GetBytes(userNamejira + ":" + passwordjira)));
LpResponse lp_response = new LpResponse();
try
{
    response = request.GetResponse();
    StreamReader reader = new StreamReader(response.GetResponseStream());
    lp_response.response = reader.ReadToEnd();
    jiraproject = (List<AllJiraProject>)JsonConvert.DeserializeObject<List<AllJiraProject>>(lp_response.response.ToString());
}
catch (Exception e)
{
    lp_response.error = e;
}
return jiraproject;

2 个答案:

答案 0 :(得分:1)

接受的答案使用的是基本身份验证,而不是Cookie。请求Cookie时,您不需要向标头添加任何授权。此方法将接受带有用户名和密码以及URL的json字符串。它将返回cookie值。

const App = () => {
  return (
    <div>
      <h1>Hello, World!</h1>
      <h2>It is {new Date().toString()}.</h2>
    </div>
  );
}

ReactDOM.render(<App />, document.getElementById('root')); 

当我使用url:http://[baseJiraUrl]/rest/auth/1/session调用它时,它会返回以下JSON响应:

public async Task<JiraCookie> GetCookieAsync(string myJsonPass, string JiraCookieEndpointUrl)
        {
            using (var client = new HttpClient())
            {
                var response = await client.PostAsync(
                    JiraCookieEndpointUrl,
                     new StringContent(myJsonPass, 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; }
}

请注意,上述网址在我使用的JIRA版本中有效,并且可能会因您使用的版本而异。

阅读JIRA API文档,了解您使用的版本的正确URL。

查看有关如何在您的HttpClient请求中添加Cookie的答案。

How do I set a cookie on HttpClient's HttpRequestMessage

答案 1 :(得分:0)

我明白了,我的代码没有对标头进行基本身份验证,而API需要基本身份验证,所以我用以下两行代替了我的一行。

替换了行

request.Headers.Set("Authorization", Convert.ToBase64String(Encoding.ASCII.GetBytes(userNamejira + ":" + passwordjira)));

替换为

byte[] authBytes = Encoding.UTF8.GetBytes("user:password".ToCharArray()); 
request.Headers["Authorization"] = "Basic " + Convert.ToBase64String(authBytes);

Jira有三种类型的身份验证,一种来自基本身份验证,很容易实现,但我不知道如何从cookie实现身份验证。