Как использовать Base64Url для кодирования объекта json, такого как заголовок JWT и полезная нагрузка, с помощью Swift - PullRequest
1 голос
/ 24 мая 2019

Я пытаюсь создать систему JWT.

Но я сталкиваюсь с проблемой, когда я Base64Url кодирую свой заголовок и объекты json полезной нагрузки.Моя выходная base64UrlString отличается от выходной строки https://jwt.io/.

Почему я получаю две разные выходные строки?

И если я вставлю свою выходную строку в https://jwt.io/ Зашифрованная область. Я получаю сообщение об ошибке «Invalid Signature».

Если я ошибаюсь, пожалуйста, помогите мне исправить мой код.

jwt.io выходная строка:

1018 * eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJUaXRsZSI6Ik5pY2UiLCJuYW1lIjoiSmltbXkiLCJhZ2UiOjU1fQ.DSdqRFRPM4Hep704s3cvWkpH5FFpnIc82uVUswHbaz4

enter image description here

мой выходной строки:

1030* WwogIHsKICAgICJ0eXAiIDogIkpXVCIsCiAgICAiYWxnIiA6ICJIUzI1NiIKICB9Cl0.WwogIHsKICAgICJhZ2UiIDogNTUsCiAgICAibmFtZSIgOiAiSmltbXkiLAogICAgIlRpdGxlIiA6ICJOaWNlIgogIH0KXQ.AhlqiFIcS-ytUKnhazsn7-eYNwgmXfwON7EN2gozRAw

enter image description here

1038 *

1 Ответ

1 голос
/ 24 мая 2019

Ваша строка вывода

WwogIHsKICAgICJ0eXAiIDogIkpXVCIsCiAgICAiYWxnIiA6ICJIUzI1NiIKICB9Cl0.WwogIHsKICAgICJhZ2UiIDogNTUsCiAgICAibmFtZSIgOiAiSmltbXkiLAogICAgIlRpdGxlIiA6ICJOaWNlIgogIH0KXQ.AhlqiFIcS-ytUKnhazsn7-eYNwgmXfwON7EN2gozRAw

содержит два массива объектов JSON (плюс подпись):

[
 {
  "typ": "JWT",
  "alg": "HS256"
 }
]
.
[
 {
  "age": 55,
  "name": "Jimmy",
  "Title": "Nice"
 }
]

[] скобки используются для массивов, а {} для объектов, следовательно, у вас есть два массива, содержащих объекты JSON вместо двух объектов JSON по желанию:

{
  "typ": "JWT",
  "alg": "HS256"
}
.
{
  "age": 55,
  "name": "Jimmy",
  "Title": "Nice"
}

Вам нужно снять одну пару [] скобок с обеих сторон и просто объявите его как массив строк, а не как массив строк.

например. как это:

let headerJson: [String: Any]  =   [
                                     "alg": "HS256",
                                     "typ": "JWT"
                                   ]

Теперь вы получите синтаксически правильный результат, но он все еще длиннее необходимого, поскольку содержит разрывы строк и пробелы. Обычно сериализатор удаляет все пробелы (пробелы, переносы строк), но в вашем коде используется опция prettyPrinted:

JSONSerialization.data(withJSONObject: json, options: JSONSerialization.WritingOptions.prettyPrinted)

Этот параметр следует использовать, только если вы хотите где-то отобразить JSON, для JWT удалите этот параметр:

JSONSerialization.data(withJSONObject: json)

Как только вы получите результат, как уже показано на скриншоте jwt.io, сначала вставьте ключ в поле ключа справа (проверьте подпись), а затем вставьте свой токен в левую сторону. Тогда вы должны получить проверенную подпись.

Хотя то, что вы здесь делаете, безусловно, полезно для целей обучения, для более серьезного использования я бы порекомендовал один из пакетов, перечисленных в https://jwt.io/, где вы найдете множество пакетов JWT для множества различных языков, включая Swift. Просто прокрутите страницу вниз, чтобы найти список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...