是否有任何方法可以生成QSH值,以使JWT令牌生成访问Zephyr API



我正在尝试使用JWT授权从Zephyr(JIRA(获取ZAPI,但生成的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();
    }

tl; dr: qsh sha256 method&amp; amp; amp; hexadecimal值相对路径&amp;查询参数按字母顺序排序

我也遇到了一些与 Zephyr qsh参数有关的问题。我是用 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;
...

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

我可以验证您使用的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;

相关内容

  • 没有找到相关文章

最新更新