Я пытаюсь получить доступ к zapi, чтобы получить данные теста от zephyr (Jira) с использованием авторизации JWT. Но сгенерированное утверждение qsh неверно, что делает JWT неверным. Есть ли альтернативный метод создания qsh на С#?
При попытке в клиенте Postman с сгенерированным значением JWT выдается ошибка, что используется неправильное значение qsh, и отображается правильное значение qsh. Я жестко закодировал отображаемое значение (вместо динамического создания qsh) для генерации JWT, и это дает успешный ответ. Код приведен ниже:
var canonical_path_t = "GET&" + RELATIVE_PATH_T + QUERY_STRING_T;
var payload = new Dictionary<string, object>()
{
{ "sub", ACCOUNT_ID }, //assign subject
{ "qsh", getQSH(canonical_path_t) }, //assign query string hash
{ "iss", ACCESS_KEY }, //assign issuer
{ "iat", iat }, //assign issue at(in ms)
{ "exp", exp } //assign expiry time(in ms)
};
string token = JWT.JsonWebToken.Encode(payload, SECRET_KEY, JWT.JwtHashAlgorithm.HS256);
client.DefaultRequestHeaders.Add("Authorization", "JWT " + token);
client.DefaultRequestHeaders.Add("zapiAccessKey", ACCESS_KEY);
client.DefaultRequestHeaders.Add("User-Agent", "ZAPI");
//code to generate qsh
static string getQSH(string qstring)
{
System.Security.Cryptography.SHA256Managed crypt = new
System.Security.Cryptography.SHA256Managed();
StringBuilder hash = new StringBuilder();
byte[] crypto = crypt.ComputeHash(Encoding.UTF8.GetBytes(qstring), 0, Encoding.UTF8.GetByteCount(qstring));
foreach (byte theByte in crypto)
{
hash.Append(theByte.ToString("x2"));
}
return hash.ToString();
}