簡體   English   中英

將 ES256 算法與 jwt-do.net 一起用於 Apple AppStore

[英]Using ES256 algorithm with jwt-dotnet for Apple AppStore

我正在嘗試生成一個jwt令牌以連接到 AppStore API。我正在使用jwt-do.net庫來執行此操作。

Apple 要求使用ES256 ,而jwt-do.net要求提供公鑰來完成這項工作。 我只從 AppStore 下載了一個私鑰。 我該如何處理?

這是我的代碼:

public static string GenerateAppStoreJwtToken()
{
   var header = new Dictionary<string, object>()
   {
      { "kid", "MY_VALUE" },
      { "typ", "JWT" }
   };

   var scope = new string[1] { "GET /v1/apps?filter[platform]=IOS" };
   var payload = new Dictionary<string, object>
   {
      { "iss", "MY_VALUE" },
      { "iat", DateTimeOffset.UtcNow.ToUnixTimeSeconds() },
      { "exp", DateTimeOffset.UtcNow.AddMinutes(20).ToUnixTimeSeconds() },
      { "aud", "appstoreconnect-v1" },
      { "scope", scope }
   };


   IJwtAlgorithm algorithm = new ES256Algorithm(???); // What am I going to use here?
   IJsonSerializer serializer = new JsonNetSerializer();
   IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
   IJwtEncoder encoder = new JwtEncoder(algorithm, serializer, urlEncoder);

   var token = encoder.Encode(header, payload, privateKey);

   return token;
}

這是對我有用的最終解決方案。 我最終切換到jose-jwt但我很確定你可以用jwt-dotnet處理同樣的事情。 我只是發現使用jose-jwt更容易一些。 這是jose-jwt的鏈接: https ://github.com/dvsekhvalnov/jose-jwt

這是最終的代碼。 請注意,我確實使用了我在p8文件中找到的私鑰,並且不需要進行任何轉換。 所以我傳遞給GenerateAppStoreJwtToken()函數的privateKey參數直接來自p8文件。

using System;
using System.Collections.Generic;
using System.Security.Cryptography;
using Jose;
    
public static string GenerateAppStoreJwtToken(string privateKey)
{
    var header = new Dictionary<string, object>()
    {
        { "alg", "ES256" },
        { "kid", "MY_VALUE" },
        { "typ", "JWT" }
    };
    
    var scope = new string[1] { "GET /v1/apps?filter[platform]=IOS" };
    var payload = new Dictionary<string, object>
    {
        { "iss", "MY_VALUE" },
        { "iat", DateTimeOffset.UtcNow.ToUnixTimeSeconds() },
        { "exp", DateTimeOffset.UtcNow.AddMinutes(15).ToUnixTimeSeconds() },
        { "aud", "appstoreconnect-v1" },
        { "scope", scope }
    };
    
    CngKey key = CngKey.Import(Convert.FromBase64String(privateKey), CngKeyBlobFormat.Pkcs8PrivateBlob);

    string token = JWT.Encode(payload, key, JwsAlgorithm.ES256, header);
 
    return token;
}

對於像我這樣在其他地方使用 JWT-dotnet 所以不想使用不同的 JWT 包的人來說,這行得通:

  • 通過刪除頁眉和頁腳(“-----BEGIN PRIVATE KEY-----”等)並刪除行尾字符以制作單個字符串以便於存儲來轉換蘋果私鑰。

  • 從 Base64 轉換並存儲在 ReadOnlySpan

     ReadOnlySpan<byte> keyAsSpan = Convert.FromBase64String(key); var prvKey = ECDsa.Create(); prvKey.ImportPkcs8PrivateKey(keyAsSpan,out var read);
  • 創建算法。 需要一個空白的 ECDsa 實例來防止 NullException,但它不僅僅用於簽署令牌,只需要驗證哪些不是必需的。

     IJwtAlgorithm algorithm = new ES256Algorithm(ECDsa.Create(), prvKey)

我能夠使用這種方法從蘋果收到回復令牌。

CNGKey 不適用於 macOS。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM