Nodejs Base64 Url Safe
一、關於Base64編碼:
雖然常用卻沒注意過,一般Base64,包含英文字母A-Z、a-z、數字0-9,這樣62個字元,然後呢,這樣還少2個字元才64個,這另外兩個就是+、/兩個符號,最後呢,編碼完成依據狀況會補上=,詳細的說明可以參考wiki。
https://zh.wikipedia.org/wiki/Base64
之前使用的情境通常是在http的header中使用,比如oauth相關的應用,可是當打算於url中使用base64編碼時,就可以發生問題了,因為編碼中包含了"+"跟"/",於QueryString使用需在編碼過,在Restful的api使用時,"/"更是會造成url路徑錯誤。
針對這個問題,Base64有一個變種,通常會說是URL and Filename Safe Alphabet,符合RFC4648, Section 5.規範,這個規範將"+"、"/"至換成"-"、"_",並移除最後的"="
二、Nodejs的Base64 encode與decode
在Nodejs常這樣用
如上面顯示的結果,Buffer.toString(),指定base64時,會依據Base64的原始規範進行編碼,所以會包含"+"、"/"、"="
那要怎麼辦?可以自己處理把"+"換成"-",把"/"換成"_",然後移除"="
另外也有套件可以安裝,我是使用base64url
npm網址
https://www.npmjs.com/package/base64url
三、解碼怎麼辦?
關於解碼的部份,不管是基本款還是RFC4648, Section 5的版本,Nodejs的Buffer都可解碼,完整的範例如下:
雖然常用卻沒注意過,一般Base64,包含英文字母A-Z、a-z、數字0-9,這樣62個字元,然後呢,這樣還少2個字元才64個,這另外兩個就是+、/兩個符號,最後呢,編碼完成依據狀況會補上=,詳細的說明可以參考wiki。
https://zh.wikipedia.org/wiki/Base64
之前使用的情境通常是在http的header中使用,比如oauth相關的應用,可是當打算於url中使用base64編碼時,就可以發生問題了,因為編碼中包含了"+"跟"/",於QueryString使用需在編碼過,在Restful的api使用時,"/"更是會造成url路徑錯誤。
針對這個問題,Base64有一個變種,通常會說是URL and Filename Safe Alphabet,符合RFC4648, Section 5.規範,這個規範將"+"、"/"至換成"-"、"_",並移除最後的"="
二、Nodejs的Base64 encode與decode
在Nodejs常這樣用
var code = new Buffer("Base64是一種基於64個可列印字元來表示二進位資料的表示方法").toString('base64');
//code:QmFzZTY05piv5LiA56iu5Z+65pa8NjTlgIvlj6/liJfljbDlrZflhYPkvobooajnpLrkuozpgLLkvY3os4fmlpnnmoTooajnpLrmlrnms5U=
console.log("code:"+code);
var decode = new Buffer(code , 'base64').toString();
//decode:Base64是一種基於64個可列印字元來表示二進位資料的表示方法
console.log("decode:"+decode);
那要怎麼辦?可以自己處理把"+"換成"-",把"/"換成"_",然後移除"="
//接續上一範例
//code:QmFzZTY05piv5LiA56iu5Z-65pa8NjTlgIvlj6_liJfljbDlrZflhYPkvobooajnpLrkuozpgLLkvY3os4fmlpnnmoTooajnpLrmlrnms5U
console.log("code:"+code.replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_"));
npm網址
https://www.npmjs.com/package/base64url
三、解碼怎麼辦?
關於解碼的部份,不管是基本款還是RFC4648, Section 5的版本,Nodejs的Buffer都可解碼,完整的範例如下:
const base64url = require('base64url');
var code = new Buffer("Base64是一種基於64個可列印字元來表示二進位資料的表示方法").toString('base64');
//code:QmFzZTY05piv5LiA56iu5Z+65pa8NjTlgIvlj6/liJfljbDlrZflhYPkvobooajnpLrkuozpgLLkvY3os4fmlpnnmoTooajnpLrmlrnms5U=
console.log("code:"+code);
//code:QmFzZTY05piv5LiA56iu5Z-65pa8NjTlgIvlj6_liJfljbDlrZflhYPkvobooajnpLrkuozpgLLkvY3os4fmlpnnmoTooajnpLrmlrnms5U
console.log("code:"+code.replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_"));
var decode = new Buffer(code , 'base64').toString();
//decode:Base64是一種基於64個可列印字元來表示二進位資料的表示方法
console.log("decode:"+decode);
//使用base64url轉換為url safe的Base64編碼
var safeUrl = base64url.fromBase64(code);
//safeUrl:QmFzZTY05piv5LiA56iu5Z-65pa8NjTlgIvlj6_liJfljbDlrZflhYPkvobooajnpLrkuozpgLLkvY3os4fmlpnnmoTooajnpLrmlrnms5U
console.log("safeUrl:"+safeUrl);
//decode2:Base64是一種基於64個可列印字元來表示二進位資料的表示方法
var decode2 = new Buffer(safeUrl , 'base64').toString();
console.log("decode2:"+decode2);
/**
output:
code:QmFzZTY05piv5LiA56iu5Z+65pa8NjTlgIvlj6/liJfljbDlrZflhYPkvobooajnpLrkuozpgLLkvY3os4fmlpnnmoTooajnpLrmlrnms5U=
code:QmFzZTY05piv5LiA56iu5Z-65pa8NjTlgIvlj6_liJfljbDlrZflhYPkvobooajnpLrkuozpgLLkvY3os4fmlpnnmoTooajnpLrmlrnms5U
decode:Base64是一種基於64個可列印字元來表示二進位資料的表示方法
safeUrl:QmFzZTY05piv5LiA56iu5Z-65pa8NjTlgIvlj6_liJfljbDlrZflhYPkvobooajnpLrkuozpgLLkvY3os4fmlpnnmoTooajnpLrmlrnms5U
decode2:Base64是一種基於64個可列印字元來表示二進位資料的表示方法
*/
留言