B- Todo List Application Tutorial

在本教程中,您將使用Blockstack和Vue.js為單頁應用程序(SPA)構建代碼并運行它。應用程序運行后,您將了解應用程序的blockstack功能。您將了解它如何使用blockctack ID管理認證,以及如何使用blockstack存儲(Gaia)存儲與該ID關聯的信息。

在你開始之前
驗證安裝了git
驗證是否安裝了npm
確保您有一個blockstack ID

任務1:安裝代碼并檢索依賴項
任務2:登錄到應用程序
任務3:學習登錄過程
任務4:解碼authRequest
任務5:在登錄代碼的底層
任務6:處理應用程序
任務7:實現存儲

如果您喜歡視頻,可以查看本教程的視頻

在你開始之前

您構建的應用程序是一個Vue.js應用程序,它是完全去中心化的,并且沒有服務器。雖然不是嚴格要求遵循,但基本熟悉Vue.js是有幫助的。完成后,app可以實現以下功能:

  • 使用blockstack對用戶進行身份驗證
  • 發布新狀態
  • 在用戶配置文件中顯示狀態
  • 查找其他用戶的配置文件和狀態

在本教程中,您將使用以下工具:

  • 工作站的命令行
  • git克隆教程代碼
  • 管理依賴項和腳本

基本標識和存儲服務由blockstack.js提供。要測試應用程序,您需要已經注冊了一個Blockstack ID。

驗證安裝了git

本教程使用git克隆教程代碼。使用要驗證的命令驗證已安裝git。

$ which git
/usr/local/bin/npm

驗證是否安裝了npm

本教程依賴于npm依賴關系管理器。在開始之前,請使用要驗證的命令驗證是否安裝了npm。

$ which npm
/usr/local/bin/npm

如果在系統中沒有找到npm,請安裝它

確保您有一個blockstack ID

最后,確保您至少創建了一個blockstack ID。您將使用這個ID與應用程序進行交互。

任務1:安裝代碼并檢索依賴項

您可以使用git克隆源代碼,或者從存儲庫下載并解壓縮代碼。這些指令假定您正在克隆。

1.通過克隆來安裝代碼。

$ git clone https://github.com/blockstack/blockstack-todos

2.切換到目錄到代碼的根目錄。

$ cd blockstack-todos

3.使用npm安裝依賴項。

$ npm install

Todo應用程序有一個基本的Vue.js結構。有幾個配置文件,但中央編程文件在src目錄:

文件 描述
main.js 應用程序初始化。
App.vue 處理authResponse的代碼。
components/Landing.vue 初始登錄頁面的代碼。
components/Dashboard.vue 應用程序數據存儲和用戶退出。

任務2:登錄到應用程序

示例應用程序在本地主機上的節點服務器中運行。在本節中,您將啟動應用程序并與之交互。

1.確保您位于代碼庫的根目錄中。

$ pwd
/Users/moxiegirl/repos/blockstack-todos

這條路徑對您來說是不同的,但是請仔細檢查最后一部分,以確保您位于克隆到的目錄中,以及運行npm install的目錄中。

2.在本地環境中啟動應用程序。

$ npm run serve
您應該會看到類似如下的輸出:

98% after emitting CopyPlugin s
DONE Compiled successfully in 5854ms 7:34:28 PM
App running at:

  • Local: http://localhost:8080/
  • Network: http://192.168.0.12:8080/
    Note that the development build is not optimized.
    To create a production build, run npm run build.

3.打開本地瀏覽器到http://localhost:8080url
你應該看到一個簡單的應用程序:

image

4.選擇使用Blockstack登錄。
如果您已經登錄到Blockstack,應用程序會提示您選擇要使用的ID。如果你沒有登錄,Blockstack會提示你:


image

如成功登入該應用程式,用戶便會看到該應用程式:


image

任務3:學習登錄過程

對于應用程序開發人員,應用程序流類似于集中登錄服務(例如OAuth)使用的典型客戶機-服務器流。然而,使用Blockstack,身份驗證流程完全在客戶端進行。

分布式應用程序(DApp)和blockstack瀏覽器在身份驗證流期間通過來回傳遞兩個令牌進行通信。請求應用程序向blockstack瀏覽器發送一個authRequest令牌。一旦用戶批準登錄,blockstack瀏覽器就會使用authResponse令牌響應應用程序。這些令牌是JSON Web令牌,它們通過URL查詢字符串傳遞。


image

當用戶選擇在DApp上使用Blockstack登錄時,它調用redirectToSignIn()方法,該方法向Blockstack瀏覽器發送authRequest。Blockstack通過authRequest參數中的URL查詢字符串傳遞令牌:

https://browser.blockstack.org/auth?authRequest=j902120cn829n1jnvoa

當blockstack瀏覽器接收到請求時,它使用臨時傳輸鍵向應用程序生成一個(authResponse)令牌。臨時傳輸鍵僅用于應用程序的特定實例,在本例中,用于簽名authRequest。應用程序在請求生成期間存儲臨時傳輸密鑰。傳輸密鑰的公共部分在authRequest令牌中傳遞。blockstack瀏覽器使用密鑰的公共部分加密通過authResponse返回的應用程序私有密鑰。

在登錄期間,blockstack瀏覽器從用戶的身份地址私鑰和應用程序的appDomain生成應用程序私鑰。app私鑰有三個功能:

  • 它用于創建憑據,讓應用程序訪問特定應用程序的Gaia存儲桶。
  • 它用于在用戶的Gaia存儲中對應用程序存儲的文件進行端到端加密。
  • 它作為一個密碼秘密,應用程序可以使用它來執行其他密碼功能。

最后,app私鑰是確定性的,這意味著對于給定的用戶ID和域名,每次都會生成相同的私鑰。

任務4:解碼authRequest

要解碼令牌并查看它包含什么信息:
1.從URL復制authRequest字符串。

image

2.導航到jwt.io
粘貼完整的令牌。
輸出應該類似如下:

{
"jti": "f65f02db-9f42-4523-bfa9-8034d8edf459”,
"iat": 1555641911,
"exp": 1555645511,
"iss": "did:btc-addr:1ANL7TNdT7TTcjVnrvauP7Mq3tjcb8TsUX”,
"public_keys": [
“02f08d5541bf611ded745cc15db08f4447bfa55a55a2dd555648a1de9759aea5f9”
],
"domain_name": "http://localhost:8080”,
"manifest_uri": "http://localhost:8080/manifest.json”,
"redirect_uri": "http://localhost:8080”,
"version": “1.3.1”,
"do_not_include_profile": true,
"supports_hub_url": true,
"scopes": [
“store_write”,
“publish_data”
]
}

iss屬性是一個分散的標識符或did。這將標識應用程序的用戶和用戶名。具體的did是一個bc -addr。

任務5:在登錄代碼的底層

現在,轉到您克隆或下載的底層blockstack-todo代碼。每個文件都處理登錄和退出:

文件 描述
App.vue 處理authResponse
Landing.vue 生成authRequest。
Dashboard.vue 處理信號。

src/components/Landing.vue 代碼配置AppConfig對象,然后使用它創建UserSession。然后,應用程序調用redirectToSignIn()函數,該函數生成authRequest并將用戶重定向到blockstack驗證器:

signIn () {
const appConfig = new this.blockstack.AppConfig(['store_write', 'publish_data’])
const UserSession = new this.blockstack.UserSession({ appConfig: appConfig })

  UserSession.redirectToSignIn()
}

一旦用戶進行了身份驗證,應用程序將在src/App中處理authResponse。vue文件。:

mounted () {
const UserSession = this.UserSession
if (UserSession.isUserSignedIn()) {
this.userData = UserSession.loadUserData()
this.user = new this.blockstack.Person(this.userData.profile)
this.user.username = this.userData.username
} else if (UserSession.isSignInPending()) {
UserSession.handlePendingSignIn()
.then((userData) => {
window.location = window.location.origin
})
}
},

如果Blockstack.isusersignedin()為真,則該用戶先前已在其中簽名,因此Blockstack從瀏覽器中提取數據并在我們的應用程序中使用它。如果對blockstack.UserSession.isSignInPending()的檢查為真,則先前的authResponse已發送到應用程序,handlePendingSignIn()函數的作用是:處理任何掛起的登錄。

注銷是在src/components/Dashboard.vue中處理的。

signOut () {
this.UserSession.signUserOut(window.location.href)
}

該方法允許應用程序創建者在用戶退出時決定將用戶重定向到哪里:

任務6:處理應用程序

現在,嘗試向todo列表添加一些項。例如,試著列出你想要在Blockstack上構建的應用程序列表:

image

每個列表都立即存儲在連接到塊堆棧ID的Gaia Hub中。有關Gaia Hub的更多信息,請參閱本文檔中的概述。你可以去取待辦事項。打開Javascript控制臺,運行以下命令添加json文件:

userSession.getFile("todos.json", { decrypt: true }).then((file) => {console.log(file)})

你應該看到一個JSON與你剛剛添加的todos:

[
{
"id”:2,
"text":"Software package manager secured by the blockchain”,
"completed”:false
},
{
"id”:1,
"text":"Mutable torrents with human readable names”,
"completed”:false
},
{
"id”:0,
"text":"Decentralized twitter”,
"completed”:false
}
]

添加另一個todo并勾選它。當您使用Javascript控制臺獲取新生成的文件時,結果會反映您的更改。尋找“完成”:正確的:

[
{
"id”:3,
"text":"Blockstack Todo”,
"completed”:true
},
{
"id”:2,
"text":"Software package manager secured by the blockchain”,
"completed”:false
},

]

現在您已經看到了應用程序的實際應用,深入了解它是如何工作的。

任務7:實現存儲

轉到您克隆或下載的底層blockstack-todo代碼。與Gaia Hub的應用程序交互起源于src/components/Dashboard.vue文件。首先,檢查Todos的更改是在哪里處理的:

watch: {
todos: {
handler: function (todos) {
const UserSession = this.UserSession
// encryption is now enabled by default
return UserSession.putFile(STORAGE_FILE, JSON.stringify(todos))
},
deep: true
}
},

傳入todos JSON對象,并使用blockstack.UserSession.putFile()方法將其存儲在Gaia Hub中。

代碼需要使用blockstack.UserSession.getFile()方法從存儲中讀取Todo項,該方法返回一個promise:

fetchData () {
const UserSession = this.UserSession
UserSession.getFile(STORAGE_FILE) // decryption is enabled by default
.then((todosText) => {
var todos = JSON.parse(todosText || '[]’)
todos.forEach(function (todo, index) {
todo.id = index
})
this.uidCount = todos.length
this.todos = todos
})
},

從promise中檢索todos數據。

總結

現在,您已經擁有了構建復雜應用程序所需的所有東西,包括身份驗證和去中心化Internet上的存儲。為什么不嘗試編寫一個訪問多個概要文件的示例應用程序呢?

如果您想了解blockstack API,可以訪問blockstack核心API文檔或blockstack JS API

GO …..

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,533評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,055評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,365評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,561評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,346評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,889評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,978評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,118評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,637評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,558評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,739評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,246評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,980評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,619評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,347評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,702評論 2 370