2017-01-18 1 views
3

Я пытаюсь отправить Push-уведомления в APN с помощью токенизации. Я попытался использовать несколько библиотек, таких как jose-jwt и класс Microsot Jwt для создания токена JWT, но я не могу обернуть его вокруг.Как кодировать JWT для токенизации APN (.NET, C#)

Я застрял на создании JWT и подписал его с помощью закрытого ключа.

Для связи с сертификатами я использовал PushSharp, и он работал отлично. Может ли кто-нибудь помочь мне с похожим примером, но с токенами?

редактирования: следующая документация от Apple здесь: https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingwithAPNs.html#//apple_ref/doc/uid/TP40008194-CH11-SW1

Пример кода: ближайший я пришел к чему-то выглядел бы так, но я не знаю, как создать CngKey правильно

var payload = new Dictionary<string, object>() 
      { 
       { "iss", issuer }, 
       { "iat", DateTime.UtcNow } 
      }; 

var headers = new Dictionary<string, object>() 
      { 
       { "kid", keyIdentifier} 
      }; 

CngKey key = CngKey.Create(CngAlgorithm.ECDsaP256); //how to create this CngKey 

string token = Jose.JWT.Encode(payload, key, JwsAlgorithm.ES256, headers); 
+0

Вы могли бы включить код, чтобы мы могли смотреть? так как вы задаете общий вопрос, я предлагаю вам прочитать это: https://stormpath.com/blog/token-authentication-asp-net-core – Valkyrie

+0

Спасибо, я посмотрю. Добавлен образец кода, который показывает, где я застрял. – user3790083

ответ

3

Спасибо за ваши ответы, пришлось связаться со многими опорами, чтобы это сделать. Вот как выглядел окончательный результат.

/// <summary> 
    /// Method returns ECDSA signed JWT token format, from json header, json payload and privateKey (pure string extracted from *.p8 file - PKCS#8 format) 
    /// </summary> 
    /// <param name="privateKey">ECDSA256 key</param> 
    /// <param name="header">JSON header, i.e. "{\"alg\":\"ES256\" ,\"kid\":\"1234567899"\"}"</param> 
    /// <param name="payload">JSON payload, i.e. {\"iss\":\"MMMMMMMMMM"\",\"iat\":"122222222229"}"</param> 
    /// <returns>base64url encoded JWT token</returns> 
    public static string SignES256(string privateKey, string header, string payload) 
    { 
     CngKey key = CngKey.Import(
      Convert.FromBase64String(privateKey), 
      CngKeyBlobFormat.Pkcs8PrivateBlob); 

     using (ECDsaCng dsa = new ECDsaCng(key)) 
     { 
      dsa.HashAlgorithm = CngAlgorithm.Sha256; 
      var unsignedJwtData = 
       Url.Base64urlEncode(Encoding.UTF8.GetBytes(header)) + "." + Url.Base64urlEncode(Encoding.UTF8.GetBytes(payload)); 
      var signature = 
       dsa.SignData(Encoding.UTF8.GetBytes(unsignedJwtData)); 
      return unsignedJwtData + "." + Url.Base64urlEncode(signature); 
     } 
    } 
+0

Не могли бы вы прокомментировать, что вы сделали, чтобы заставить это работать? И объясните, где вы нашли ответы, которые вам нужны, если не здесь. – Mike

+0

Форум Jose-jwt и поддержка Apple. Мне не хватало кодировок Base64 выше, чтобы заставить его работать. Ребята из Apple в конечном итоге сформировали код выше с их намеками. Я не мог найти официальную документацию для рабочего примера на C#. – user3790083

+0

Любые советы о том, как вы отправили уведомление на сервер Apple? Я пробовал много вещей, чтобы заставить его работать, но не повезло. Если у вас есть какой-либо код, мы будем очень благодарны! –

2

Вот что я использую:

var privateKeyContent = System.IO.File.ReadAllText(AUTHKEYFILE); 
var privateKey = privateKeyContent.Split('\n')[1]; 
var secretKeyFile = Convert.FromBase64String(privateKey); 
var secretKey = CngKey.Import(secretKeyFile,CngKeyBlobFormat.Pkcs8PrivateBlob); 
+0

Спасибо за ваш ответ, уже было решение. Просто добавил. Возможно, вы можете использовать его. – user3790083

Смежные вопросы