iT邦幫忙

2021 iThome 鐵人賽

DAY 10
0
自我挑戰組

從無到有打造驗證碼共享的 Line 機器人系列 第 10

幫 Line Bot 加上身份驗證(1)

昨天我們讓 Line Bot 可以成功回應使用者驗證碼了,但是這樣只要任何人加入 Line Bot 都可以獲取驗證碼! 雖然只獲取驗證碼也不一定能做什麼事,但總是以資訊安全觀點來說不太好,所以今天開始要幫驗證碼小幫手加上身份驗證的功能!

流程構思

  1. 產生幾組不重複的驗證碼
  2. 手動發送給想讓他認證的家人
  3. 家人成為 Line Bot 的好友,Line Bot 打招呼
  4. Line Bot 選單 & 訊息回應提示使用者在 Line 對話框輸入身份認證的驗證碼
  5. GAS 專案收到訊息,進行身份認證並記錄
  6. 認證成功,可以正常使用獲取驗證碼的功能了~

那麼今天就來研究要怎麼產生不重複的驗證碼吧!

UUID (Universally Unique IDentifier)

UUID 具有識別資訊的唯一性,用來作為產生不重複驗證碼的基底再適合不過了

文件

通用唯一辨識碼 - 維基百科,自由的百科全書

通用唯一辨識碼(英語:Universally Unique Identifier,縮寫:UUID)是用於電腦體系中以辨識資訊的一個128位元識別碼。根據標準方法生成,不依賴中央機構的註冊和分配,UUID具有唯一性,這與其他大多數編號方案不同。重複UUID碼概率接近零,可以忽略不計。

如何用 JavaScript 產生 UUID / GUID? | Summer。桑莫。夏天
p.s Summer 大大的文章惠我良多,推薦各位閱讀!

使用簡易的 UUID 產生驗證碼

看完文件後我們可以得知,使用 Math.random() 就可以得到最基本的UUID,只是可能需要過濾重複的數值。因為我們只是要產生不重複的驗證碼,所以只要用 Math.random() 產出多組8碼驗證碼,再刪除重複的值即可。

建立 generateVerificationCode.gs

建立一個 generateVerificationCode.gs 內容如下:

  1. (1 + Math.random()) * 0x10000 產生一個範圍在 65536~131072 (不包含 131072) 的浮點數
  2. 將步驟 1 產生出來的數字跟 0 做 | 的位元運算,只保留該數字的整數部分
  3. 轉成16進制的文字,並去掉第一個字元 (因為第一個字元一定是1)
  4. 如此一來即可得到一個亂數4碼的驗證碼,重複兩次即可得到8碼
  5. 使用 js 的 Set 特性過濾掉重複的陣列元素
  6. 得到最多10組的不重複亂數8碼驗證碼
function generateVerificationCode() {
  var amount = 10;
  var verificationCode = [];
  var i = 0;
  var front = "";
  var end = "";
  while ( i < amount) {
    front =  (((1 + Math.random()) * 0x10000)|0).toString(16).substring(1);
    end =  (((1 + Math.random()) * 0x10000)|0).toString(16).substring(1);
    verificationCode.push(front+end);
    i++;
  }

  var uniqueVerificationCode = [...new Set(verificationCode)]

  Logger.log(uniqueVerificationCode)
}

今天就先到這裡~明天有颱風又要補班讓心情不美麗,但希望颱風不要造成災害!
明天會繼續完成接下來的流程~


上一篇
部署 Google App Script 專案(2) & Line Bot 簡單回應訊息
下一篇
幫 Line Bot 加上身份驗證(2)
系列文
從無到有打造驗證碼共享的 Line 機器人30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言