什麼是會籍授權?
會籍授權,是綁定在有效會籍上、而不是綁定在單次購買上的產品金鑰。成員手上那份你的外掛程式、腳本或機器人,會定期檢查金鑰:會籍還在,它就能用;會籍結束,它就停止;對方重新加入,它又會恢復運作。會籍就是授權。Nadi 用來形容它的就是這句話:你的會籍就是授權。
為什麼會有這種東西
賣會執行的產品的人——設計軟體的外掛程式、腳本、機器人、小型網頁工具——都知道這種失衡。銷售只發生一次,工作卻永遠不會停:宿主應用程式每出一個新版本就得跟著更新、回答問題、修正錯誤,還有兩年前的買家到現在還在寫信給你。
訂閱解決了錢的那一面,卻留下一個問題:是什麼讓訂閱值得續約?如果產品在停止付款的人手上照樣能用,續約就等於是捐款。
會籍授權把這兩端綁在一起。對方還是成員時,他手上那份就能執行。會籍結束,它就停止。對方回來,它又能執行。大型專業軟體多年來一直是這樣運作的;比較新的地方,是把金鑰綁在社群的會籍上,而不是綁在單次購買上。
運作方式:一把金鑰、一項檢查、一段寬限期
三個部分,每一個都解決一個顯而易見的問題。
- 金鑰。一長串隨機字元,屬於一位成員和一項產品。謹慎的平台會把它打亂後再儲存,而不是照原樣存放,所以就算讀得到資料庫,也讀不出金鑰。
- 檢查。你的產品把金鑰送到一個網址,拿回一個簡短的答案:有效或無效。只要在你的產品裡加幾行程式碼,不需要你自己架伺服器。
- 寬限期。每一個「有效」都附帶一個經過簽章的到期時間。產品會在這段時間內保留這份核准,在它過期之前都不會再問一次,所以離線也能運作。簽章則讓任何人都無法靠修改自己電腦上的檔案來延長它。
寬限期讓這個概念真正可行。沒有它,網路連線就會變成執行產品的必要條件,你的客戶在飛機上就沒辦法工作。有了它,最糟的情況也只是某個已經離開的人還能多用幾天——對一個不會壞掉的產品來說,這個代價非常公道。
最重要的問題:授權伺服器掛掉時會怎樣
這就是值得信任的設計和不值得信任的設計之間的分別。你的產品發出詢問,卻沒有得到答案:連線斷了、平台掛了、回覆逾時了。這時產品該怎麼做?
它應該繼續運作。只有明確的拒絕——一個清楚表示這把金鑰已撤銷或無法辨識的答案——才可以讓產品停下來。沒有回應、錯誤和逾時都不是拒絕;把它們當成拒絕,就等於讓別人的服務中斷,在你的客戶面前弄壞你的產品。
一句話:有疑慮時放行,確定時才擋下。在任何平台上建立之前,先問清楚它在這一點上怎麼做,也要讀一讀對方叫你貼進產品裡的程式碼。如果它把網路故障當成撤銷,付出代價的會是你的名聲。
什麼可以誠實地授權,什麼不行
界線很簡單:會執行的東西可以授權,不會執行的就不行。檢查就是產品打電話回家,而靜態檔案哪裡都打不了電話。
- 外掛程式、腳本、應用程式、機器人:它會執行,所以能發問,你也能讓它停止執行。在這裡,授權是真的。
- 圖片、音訊檔、文件、一組預設集:下載一次就留著了。它裡面沒有任何東西會去問任何人任何事,之後也沒有辦法收回。
所以,說一個靜態檔案「已授權」,是一個沒有人能落實的說法。對這些東西來說,誠實的機制就是門本身:會籍決定能不能下載,離開的人就拿不到下一個版本。這是真的,也很有用——只是它不是授權,也絕不該被當成授權來賣。
該問任何平台的問題
六個問題,就足以評斷這個概念的任何一種實作:
- 金鑰是在會籍結束的同一刻失效,還是要等每月的週期或每晚的排程作業?
- 如果成員回來了,他的舊金鑰會跟著恢復,還是他得把一把新的貼進你的產品裡?
- 寬限期有多長?由誰設定?答案有沒有經過簽章,讓人無法偽造?
- 平台掛掉時,端點會說什麼:「我無法回答」,還是「無效」?
- 整合需要幾行程式碼?你需不需要自己的伺服器或資料庫?
- 它會不會在根本無法落實的東西上,也提供授權開關?一個讓你替靜態檔案授權的平台,賣給你的是一個表象,而不是一套機制。
實際例子:Nadi 怎麼做
Nadi 是一個社群平台,所以這一段是在介紹我們自己的產品。只寫它現在做得到的事。
- 擁有者把社群資源庫裡的某個項目標示為已授權,每位成員就會拿到自己的金鑰,顯示在項目卡片上,旁邊附有複製按鈕。
- 會籍還在,金鑰就能通過驗證;會籍一結束,它就會顯示 REVOKED——不管是成員自己離開、被移除,還是訂閱失效。
- 他們重新加入時,同一筆紀錄就會恢復,所以沒有人需要把新金鑰貼到任何地方。
- 整合只要在你的產品裡加大約十行程式碼。它每週檢查一次金鑰,其間離線也能繼續運作。
- 寬限期預設為七天,而且答案經過簽章,所以你的產品分辨得出,哪個是我們發的寬限憑證,哪個是有人在自己電腦上改過的檔案。
- 端點出錯時會放行。我們無法回答時,就會直說,絕不會改口說「無效」。我們這邊的服務中斷,絕不會被包裝成撤銷。
- 擁有者看得到誰在使用這個項目、每位持有人的狀態——運作中或已停止——以及他們的產品上一次簽到是什麼時候。
- 發布這個項目的新版本時,只會通知持有金鑰的人,而不是整個社群。
- 會籍失效的成員看到的拒絕訊息,會寫出社群的名字,並說明怎麼讓產品恢復:重新加入這個社群。
誠實面對限制
在 Nadi 上,任何東西在證明自己做得到之前,都不能被稱為已授權。每一個項目、檔案或連結的開關都會保持關閉,直到那個項目自己的產品至少用一把真正的金鑰呼叫過一次我們的檢查——產品得先在我們面前示範過這套機制,「已授權」這幾個字才能出現在它的頁面上。因此,一個成員下載後從來沒有接上檢查的檔案,在我們產品的任何地方都不會被稱為已授權;它誠實的機制是門,由會籍決定能不能下載。關閉授權則隨時都可以。
出錯時放行是一個承諾,而不是漏洞。端點無法查詢資料庫時,會回答「無法使用」,而我們交給你的程式碼片段,會把任何不是明確答案的回應,都當成可以繼續執行的許可。這表示已經離開的人,可能還能一直用到寬限期結束,而我們是刻意接受這一點的:別人的產品,不能因為我們某次部署出了點小狀況就壞掉。
最後兩個限制。金鑰是跟著會籍來的,目前沒有辦法不加入就持有一把。而一把被分享出去的金鑰,仍然是綁在一份會籍上的一把金鑰——那份會籍一停,它就停。