【问题标题】:Is there any method to generate qsh value for JWT token generation to access zephyr api?有没有什么方法可以为 JWT 令牌生成生成 qsh 值以访问 zephyr api?
【发布时间】:2019-10-03 18:27:42
【问题描述】:

我正在尝试访问 zapi 以使用 JWT 授权从 zephyr(Jira) 获取测试详细信息。但是生成的 qsh 声明不正确,这使得 JWT 不正确。有没有其他方法可以在 C# 中创建 qsh?

当使用生成的 JWT 值在 Postman 客户端中尝试时,它会给出错误,即使用了不正确的 qsh 值并显示正确的 qsh 值。我对 JWT 生成的显示值(而不是动态 qsh 创建)进行了硬编码,这给出了成功响应。 代码如下:

    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();
    }

【问题讨论】:

    标签: c# jwt jira-zephyr


    【解决方案1】:

    TL;DR:qshsha256 的十六进制值,方法和相对路径和查询参数按字母顺序排序

    我也遇到了一些与 Zephyrqsh 参数相关的问题。我是用 NodeJS 自己创建的。似乎主要路径工作正常,但其中一些使用查询参数,他们给我qsh不正确。

    最后一个原因是qsh字段中的查询参数应该按字母顺序排序。它与路径无关,只是正确生成qsh 的要求。使用 NodeJS,我只在生成 qsh 之前做了这个:

    const sortedQueryString = queryString.split("&").sort().join('&');
    const canonicalPath = `${method}&${relativePath}&${sortedQueryString}`;
    

    所以,对于您的 C# 实现,我认为它应该是这样的(未测试):

    var sorted_query_string = QUERY_STRING_T.Split("&").Sort().Join("&");
    var canonical_path_t = "GET&" + RELATIVE_PATH_T + "&" + sorted_query_string;
    ...
    

    不要忘记在相对路径和查询参数之间包含 &。不要使用

    【讨论】:

      【解决方案2】:

      我可以验证您使用的 getQSH 方法应该有效(因为我自己必须与 ZAPI 进行交互)所以我首先要检查的是您的规范路径。确保它的结构正确。比如……

              var RELATIVE_PATH = $"/public/rest/api/1.0/executions/search/cycle/{cycle}";
      
              var QUERY_STRING = $"offset={offset}&projectId={project}&versionId={version}";
      
              var canonical_path = "GET&" + RELATIVE_PATH + "&" + QUERY_STRING;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-11-29
        • 2020-09-21
        • 2020-09-28
        • 1970-01-01
        • 2020-05-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多