[英]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.