Персональные API-ключи не работают

Я следую руководству по получению API-ключей для каждого пользователя: User API keys specification.

Я выполнил все шаги: клиент генерирует пару публичного/приватного ключей и URL возврата, переходит по маршруту Discourse, пользователь предоставляет приложению разрешение на использование Discourse, и Discourse генерирует API-ключ.

Однако, когда Discourse возвращает API-ключ в виде «payload» в URL возврата, этот ключ не работает. Я пытаюсь его расшифровать, но у меня не получается.

Я вставляю этот ключ в стандартную JavaScript-функцию расшифровки (как, например, в ответе здесь), и получаю ошибку «length is invalid» (или DATA_LEN_NOT_EQUAL_TO_MOD_LEN, в зависимости от используемого метода расшифровки в JavaScript).

Есть ли у кого-нибудь идеи, как это исправить?

Это критически важная функциональность, поэтому любая помощь будет очень кстати.

Нужно ли мне каким-то образом изменить ключ, предоставленный в payload? Возможно ли, что ключ из payload вообще не работает?


Немного подробнее:

Я думаю, что мой общий подход верен, потому что Discourse предлагает ещё один способ получения ключа для каждого пользователя, и я успешно расшифровываю этот ключ:

Если я не указываю URL перенаправления в запросе к Discourse, он не выполняет перенаправление. Вместо этого он отображает ключ на экране, чтобы пользователь мог его скопировать.

Этот ключ короче, чем ключ из «payload» (около 684 символов против примерно 762 символов в payload). И этот ключ работает — я успешно расшифровываю его с помощью JavaScript.

Но просить пользователя копировать и вставлять API-ключ — это запутанно для пользователей; правильный сценарий — получение ключа из payload. Как заставить работать ключ из payload?

Есть какие-то идеи по этому поводу? Как заставить работать API-ключ, предоставленный в полезной нагрузке?

Мне удалось заставить это работать. @RGJ любезно указал на следующее:

Когда Discourse выполняет перенаправление и отправляет API-ключ для декодирования как полезную нагрузку в URL перенаправления, этот ключ проходит URL-кодирование. Чтобы получить фактический API-ключ, необходимо выполнить URL-декодирование полезной нагрузки. В результате получается правильно работающий API-ключ (который соответствует длине ключа, отображаемого Discourse на экране).

Я привел шаги, которые я выполнил для достижения этого результата, здесь: