Расшифровка Base64URL с помощью JavaScript?

Так что я в тупике. Я знаю, что существует множество кодировщиков / декодеров Base64 для JS, но не для модифицированного (и предпочитаемого Facebook) варианта Base64URL. Пока поиск по stackoverflow не удался.

Да, я мог бы использовать PHP или другую серверную библиотеку для его декодирования, но я стараюсь сохранить это универсальным независимо от того, какую платформу я использую ... например, если бы я размещал приложение Facebook только для HTML на Amazon S3 / CloudFront и используйте их JS SDK и jQuery только для обработки форм и получения данных.

Тем не менее, кто-нибудь знает какие-либо декодеры, специфичные для Base64URL для JavaScript?

Заранее спасибо!


person chrisfullman    schedule 08.03.2011    source источник
comment
Base64Url кодировка указана в RFC 4648, кодировках данных Base16, Base32 и Base64. Единственная разница между Base64 и Base64Url - это два значения (62 и 63). Просто замените "+" на "-" и "/" на "_".   -  person jww    schedule 23.06.2014
comment
@jww это будет правильно? var base64url = function(aStr) { return btoa(aStr.replace(/\+/g,'-').replace(/\//g,'_')).replace(/\=+$/m,'') } с испытанием = раздели?   -  person Noitidart    schedule 12.05.2016


Ответы (3)


Используйте это перед декодированием:

var decode = function(input) {
        // Replace non-url compatible chars with base64 standard chars
        input = input
            .replace(/-/g, '+')
            .replace(/_/g, '/');

        // Pad out with standard base64 required padding characters
        var pad = input.length % 4;
        if(pad) {
          if(pad === 1) {
            throw new Error('InvalidLengthError: Input base64url string is the wrong length to determine padding');
          }
          input += new Array(5-pad).join('=');
        }

        return input;
    }

После использования этой функции вы можете использовать любой декодер base64

person mohamad    schedule 14.08.2018
comment
Ах, те времена, когда вы хотите, вы можете проголосовать дважды :) - person Shmuel Kamensky; 21.05.2020

Решение:

var b64str = base64.encode('foo bar');

// fix padding according to the new format
b64str = b64str.padRight(b64str.length + (4 - b64str.length % 4) % 4, '=');

Использование этого отличного кодирования / декодирования base64: http://code.google.com/p/stringencoders/source/browse/trunk/javascript/base64.js.

Также зависит от метода padRight:

String.prototype.padRight = function(n, pad){
    t = this;
    if(n > this.length)
        for(i = 0; i < n-this.length; i++)
            t += pad;
    return t;
}
person Simeon    schedule 08.03.2011
comment
Привет, Симеон ... Я думаю, что это может сработать, но я думаю, что мне также нужно заменить - и + на _ и / - тем не менее, хорошая отправная точка. Я надеялся найти такую, в которой все было бы заключено в одну и ту же библиотеку, но, полагаю, мне, возможно, придется немного изменить библиотеку в конце концов. - person chrisfullman; 09.03.2011
comment
Странно ... на самом деле, я только что написал JS-версию этого ответа: stackoverflow.com/questions/1228701/ - person Simeon; 09.03.2011

person    schedule
comment
При этом используются обычные, небезопасные для URL-адресов символы сопоставления. См. RFC 4648 §5 (en.wikipedia.org/wiki/Base64) - person Patrick Favre; 20.03.2019