“使用以太坊登錄” (Sign-In with Ethereum, SIWE) 顛覆了用戶在互聯網上的選擇。
用戶不再需要向一些大型中間商妥協,現在可以使用控制其區塊鏈賬戶的同一個私鑰直接登錄(不需要經過中間商)。通過SIWE,我們開闢了另一條道路,大公司不再能剝奪用戶訪問服務的能力,也不能監視他們的行為。
SIWE 是一個完全公開的認證標準,通過與dapp、app、錢包、安全公司等社區成員的公開討論來實現。你可以在網站login.xyz 上找到所有的會議記錄和筆記。這種方法與科技巨頭或政府供應商的專有身份系統的封閉式開發大相徑庭(受到隱私和數字權力倡導者的抗議)。
相比之下,Sign-In with Ethereum (EIP-4361) 為以太坊賬戶定義了一種開放的知識共享(creative commons, CC) 簽名格式,以安全地驗證任何基於網絡的服務。 SIWE 由社區構建,獲得以太坊基金會和ENS 的直接支持,並且Spruce 於去年年底開始負責該項目。我很高興能在這裡討論“使用以太坊登錄” 的意義,以及對於Web3 的所有構建者來說它是如何超越“連接錢包” 的。
連接錢包vs. 使用以太坊登錄
“連接錢包” 這個按鈕是現在dapp 的主要功能。點擊這個按鈕,用戶就開始了與Web3 和區塊鏈交互的旅程。
通過連接錢包,應用程序可以知道你使用的是哪個賬戶;然而,僅此而已。你的錢包更容易了解你想用哪個賬戶來與智能合約互動、發送加密貨幣,甚至通過dapp 對信息進行簽名。連接錢包的功能非常簡單—— dapp 對你“毫無記憶”,只是為簡單的交互搭建了一個平台。
當應用程序想要和用戶進行更豐富的情境交互(contextual interactions) 時,比如加載用戶的偏好或隱私聊天訊息,我們首先需要確保我們是在和該賬戶背後的實際私鑰持有者對話,而不是某個假裝對賬戶持有控制權的人。 “連接錢包” 不提供這種保證,但SIWE 可以。換句話說,我們需要對用戶進行身份驗證,以便與他們建立一個session,然後安全地讀寫他們的數據。為了說明兩者的區別,我舉了以下兩個例子—— 連接錢包的Carl 和建立session 的Sam:
(譯者註:Session 在是一種用來在客戶端與服務器端之間保持狀態的解決方案。其基於思路是: 客戶端第一次訪問時,服務器端生成一個session id 返回給客戶端,當然服務器端也會把這個session id 存在內存中,客戶端得到這個session id 後,在後續的每個請求中會把這個session id 傳回服務器,這樣服務器查詢自己內存就知道這個客戶端曾經訪問過。Session 可以用來實現用戶的登錄認證。服務器端生成的session id 傳回客戶端后,往往會保存在cookie 中,所以Session-based 認證也稱為Cookie-Based 認證。來源)
Carl 使用dapp 並有一個很好的體驗。他可以在Uniswap 上進行交易,在Aave 上借貸,甚至在OpenSea 上購買NFT。進行這幾項操作只需要連接他的錢包。 Carl 的操作一直都挺順利的,直到有一天,他遇到了這樣的問題:他希望這些dapp 能夠記住他的一些情況,以便在他第三次、第四次和第五次使用這些dapp 時,能給他更好的體驗。
Carl 在想,如果Uniswap 能自動導入他的優先清算權,Aave 能夠記住他最喜歡的借貸市場,甚至OpenSea 能記住他的名字而不是0x2Fe1a3… 這樣的賬戶,他的體驗會好很多。 Carl 每次連接他的錢包時都要從頭開始。
Sam 就不會有這樣的問題了。 Dapp 對其進行了認證並且建立了session 之後,相關信息就會被保存下來。即便Sam 斷開連接並且重新進行認證,session 也會從他離開時的狀態繼續,應用程序仍然記得與他相關的一切。他的信息甚至可以保存在他控制的一個遠程數據庫中。
使SIWE 一元化
縱觀Web3 領域,你會發現許多現有的服務提供某種形式的”Sign-In with Ethereum”,但沒多少能達到標準的。他們通常會使用它來和用戶建立一個基於cookie 的session,該session 可以管理該賬戶相關的專有元數據。比如,如果你想要給用戶權限在你的網站上自定義他們自己的個人檔案(像OpenSea 那樣),你應該在用戶可以做出任何更改之前對他們進行身份驗證,以確保只有用戶可以編輯他們自己的個人檔案。工作流程如下所示:
連接錢包後的第一步是給用戶提供人類可讀的消息,這樣他們才能理解自己進行了什麼交互。在很多案例中,用戶看到的是”LOGIN” (登錄) 字樣,或者一些讓你登錄的文字,甚至有時只是一個任意的數字(在這裡,對這個隨機的瘋狂的字母和數字集合簽名吧)。那麼相反,我們可以根據現有實踐確定一組必需的字段、設定好許多良好的安全措施和一個在人類可讀和安全運行之間平衡的嚴格語法。此外,錢包不需要改變它們現有界面和實踐,至少可以繼續為用戶提供這類信息。
首先,我們可以接收所有這些混亂的“SIWE” 信息,並以一種可接受的通用方式向用戶提交請求:
共享信息- 共享界面
對簽名信息格式達成一致後,應用程序和錢包現在可以說同一種語言了。當應用程序向用戶提交簽名請求時,錢包可以檢查該請求,檢查它是否與EIP-4361 (SIWE) 信息相符,並讓用戶知道他們正在登錄一個網站。
在這一點上,錢包可以呈現一個友好的程式化的界面,讓用戶體驗更佳,並且不對用戶將要採取的行動產生任何懷疑。而不是給用戶一個任意的文本塊來簽名。用戶現在只需點擊一個確認對話框來“登錄”,因為錢包能夠“理解” 簽名請求。為了實現完全透明,EIP-4361 規範中聲明所有信息和字段仍然必須在其他子界面(如詳細視圖) 中可用。
從EIP-4361 的信息中,我們可以得到一個更清晰的界面:
該規範還為錢包引入了額外的安全要求,例如引入域綁定以防止釣魚攻擊;引入nonces 以防止重放攻擊,用戶在整個過程中得到了進一步的保護。比如,如果錢包發現一個有效的SIWE 信息,但是用戶正在對example.com 進行簽名(但實際上是在exampie.com),錢包可以警告用戶該情況:
身份驗證之外
SIWE 信息也可以被理解為訪問特定資源的授權,或者對session 私鑰的委託,以提高dapp UX 的功能性和易用性。例如,想像一下,在這樣一個世界裡,用戶可以使用他們保留的數據來豐富他們自己的session,而不是應用程序保存用戶的數據。想要了解更多信息,強烈建議大家看看這篇文章:
來源| blog.spruceid.com
作者| Rocco