498 字
2 分鐘
[範例] popupForm 取得憑證 | 自然人憑證開發筆記
2024-01-03
無標籤

首頁 > 系列文 > 自然人憑證開發筆記

從上一篇我們了解到可以透過 popupForm 來跨域操作自然人憑證,本篇範例為,如何來取得使用者的公鑰與資訊。

以下為兩個視窗交換資訊方式,不了解的可以先回去看上一篇文章。


Demo#


範例程式#

以下範例為存取 http://127.0.0.1:61161/pkcs11info?withcert=true 的資訊,這個 JSON 就包含了憑證、姓名、身分證末四碼、卡號等資訊,可以參考前面文章的說明。


程式碼說明#

來逐行說明上面程式的內容。

步驟一、另開 popupForm 小視窗

getUserCert 為按下按鈕後觸發的事件,這裡先打開一個 popupForm 視窗;並設定一個計時器,在 5 秒後關閉小視窗,並跳出錯誤。

let popupForm;
let timeout;
function getUserCert() {
popupForm = window.open(
"http://localhost:61161/popupForm",
"popupForm",
"height=200, width=200, left=100, top=20"
);
timeout = setTimeout(() => {
popupForm.close();
alert("尚未安裝元件");
}, 5000);
}

步驟二、註冊 Message Listener

我們需要註冊 Message Listener 來觸發收到訊息後要做的事,首先,先檢查對方來源是不是 http://localhost:61161。

接著判斷,如果對方傳過來的 func=getTbs,代表是第一次建立連線,先關閉掉上面的計時器,然後透過 postMessage 傳要執行的指令過去,範例是{ func: "GetUserCert" }

若傳過來的 func 不是 getTbs,代表是回傳回來的資料,這時候把回傳的資料顯示到網頁上。

這裡提供兩個 func,前者包含公鑰,後者只有讀卡機資訊:

function receiveMessage(event) {
if (event.origin !== "http://localhost:61161") return;
let ret = JSON.parse(event.data);
if (ret.func === "getTbs") {
clearTimeout(timeout);
const tbsData = { func: "GetUserCert" };
// 取得讀卡機資訊改為 { func: "CheckEnvir" }
popupForm.postMessage(JSON.stringify(tbsData), "*");
} else {
document.getElementById("info").innerHTML = event.data;
}
}
window.addEventListener("message", receiveMessage, false);

結語#

取得公鑰等資訊,是不需要輸入使用者 pin 碼的,任何網站透過前端都可以存取。

▶ 閱讀更多:深入淺出自然人憑證