智慧合約中的OAuth和API認證

買賣虛擬貨幣
OAuth是主流的API認證和授權方式,使用者無須暴露其身份資訊即可訪問各種網站和應用。乍一看,我們似乎很難從OAuth這樣的鏈下Web2服務中獲取資料並上傳至鏈上智慧合約。然而,有了Chainlink外部介面卡 ,就可以在鏈下展開復雜的運算,這與基於OAuth的API認證無任何差異。接入外部介面卡後,就可以使用OAuth訪問更多安全的鏈下資料來源,並輕鬆實現與鏈上智慧合約的互動。我們可以從Solidity或其他智慧合約中呼叫這些安全的API,訪問各種服務並同時保障安全。本文將為大家分步驟展示Reddit外部介面卡。
OAuth是什麼?你上網的時候通常需要證明自己的身份。最簡單的證明方式是使用使用者名稱和密碼,這也被稱為密碼認證或基礎認證。然而,還有一種方式也可以證明我們的真實身份,那就是讓別人來為我們做擔保。這就是OAuth的工作原理,它是一種第三方通證認證,即其中一方為另一方做認證。OAuth的執行機制是,雙方委託第三方透過數字通證的方式證明其中一方的身份。以下這個例子可以簡明扼要地概括其精髓:Bob希望從Alice手中獲取資料,但不希望把密碼交給Alice或暴露自己的身份資訊。Bob和Alice有個共同的朋友,Margaret。Margaret跟Bob說她可以給他發一個臨時通證,Bob可以用這個通證向Alice獲取資料,Alice不需要知道Bob叫什麼名字,也不需要獲得任何Bob的個人資訊。Alice只知道請求資料的人是可以相信的。Margaret借給Bob一個通證從Alice那獲取資料,這有點類似你把酒店房卡借給別人。
一旦在系統中新增了OAuth,就多出了一個步驟,即訪問所需的資料,因為你得先等待可信第三方響應才能繼續下去。基礎認證只需輸入密碼就可以,而OAuth認證則需等待從第三方獲得通證。我們都知道,以太坊(1.0)等區塊鏈的流程是同步執行的,也就是說這類區塊鏈只能同時做一件事,因此等待通證獲得API響應的過程就會顯得有點笨重。另外,Solidity需要等待通證傳回才能呼叫新的API,這也會造成gas浪費。有一個好辦法可以解決這個問題,那就是使用Chainlink外部介面卡統一訪問鏈下資料來源,這不僅可以加速智慧合約的OAuth認證,還可以降低gas成本。在Nodejs中使用OAuth外部介面卡可以實現在Solidity智慧合約中完成OAuth認證,我們在開發外部介面卡時,首先要決定是自己親自開發OAuth handler還是試用別人開發的handler。OAuth handler是指一段程式碼,讓我們可以輕鬆處理登入和登出。絕大多數情況下,如果已經有現成的解決方案,我們就不必重複勞動了。一些平臺已經採用了OAuth認證,你一般可以找到現成的OAuth handler。比如,我們找到了這個非常好用的Reddit handler,我們可以執行程式碼檢視其功能。這裡有兩個主要的函式:async _getToken ()
以及_makeRequest (method, url, data, token)_getToken()函式的作用是獲取通證,_makeRequest函式的作用是向Reddit URL傳送最終認證請求以及通證。在這個實現中,這兩個函式可以被_sendRequest一起呼叫。我們可以看到_getToken ()函式實際上是透過基礎認證方式與第三方互動的。return new Promise((resolve, reject) => {      get.concat({
        url: TOKEN_BASE_URL,        method: 'POST',        form: {          grant_type: 'password',          username: this.username,          password: this.password
        },        headers: {          authorization: `Basic ${Buffer.from(`${this.appId}:${this.appSecret}`).toString('base64')}`,          'user-agent': this.userAgent        },        json: true,
        timeout: REQUEST_TIMEOUT      }, (err, res, body) => {        if (err) {          err.message = `Error getting token: ${err.message}`          return reject(err)        }
_makeRequest ()函式使用的是通證而不是密碼。return new Promise((resolve, reject) => {      const opts = {        url: url,        method: method,        headers: {
          authorization: token,          'user-agent': this.userAgent        },        timeout: REQUEST_TIMEOUT      }現成的可以拿來用,這點無可厚非,但同時我們也要理解它的執行機制,這樣當有需要的時候也能自己動手開發。
現在OAuth的程式碼已經都完成了,接下來就可以把外部介面卡模板中的內容替換掉了!你可以隨意選擇自己喜歡的介面卡,但是我們在這裡用的是Chainlink外部介面卡模板。如果你之前看過關於開發外部介面卡的文章,那麼接下來的內容應該對你來說非常簡單!我們可以把這些程式碼全部複製貼上到我們的外部介面卡中,不過更好的方法是直接匯入,這樣我們就可以把全部精力放在Solidity和智慧合約程式碼上,而不是認證環節。Reddit外部介面卡現在OAuth handler設定好了,我們可以把它新增到我們的Chainlink外部介面卡中,方法跟其他Chainlink介面卡完全一樣。我們可以將介面卡新增到列表中,然後使用OAuth認證開展任何所需的計算任務。如果仔細研究Reddit外部介面卡的程式碼,可以看到開發框架跟index.js中的完全一樣。與上一篇關於外部介面卡的文章一樣,我們也只需更新index.js中的程式碼。最大的不同點是我們在這裡安裝了一個新的包,即Reddit包,程式碼如下:const Reddit = require('reddit')我們所有的身份認證資訊都可以這樣新增:const reddit = new Reddit({
  username: process.env.REDDIT_USER,  password: process.env.REDDIT_PASSWORD,  appId: process.env.REDDIT_API_KEY,  appSecret: process.env.REDDIT_API_SECRET,  userAgent: 'tweether',})
一旦你在Reddit網站建立了一個APP,就會獲得REDDIT_API_KEY和REDDIT_API_SECRET,並用於介面卡中。我們可以利用外部介面卡的許多引數來定製化智慧合約傳送到Reddit的內容。const customParams = {  sr: false,  kind: false,  resubmit: false,  title: false,
  text: false,  endpoint: false,  url: false,}這些定製化引數都可以在Reddit API文件中找到。我們對模板還做了一個比較大的修改,那就是我們沒有用Requester物件傳送請求,而是使用了Reddit物件,程式碼如下:
reddit    .post(endpoint, {      sr: sr,      kind: kind,      resubmit: resubmit,      title: title,
      text: text,      url: url,    })    .then((response) => {      response.json.data.result = response.json.data.id      response.json.status = 200
      callback(response.json.status, Requester.success(jobRunID, response.json))    })    .catch((error) => {      callback(500, Requester.errored(jobRunID, error))    })程式碼寫完以後可以來測試一下!
設定四個環境變數,然後執行以下程式碼:git clone https://github.com/tweether-protocol/reddit-cl-eacd reddit-cl-eayarnyarn start開啟另外一個終端,用以下命令進行測試:
curl -X POST -H "content-type:application/json" "http://localhost:8080/" --data '{ "id":0, "data":{"title":"HELLO" }}'你在輸出中就可以看到在Reddit上釋出的內容了!如果有時間,你還可以檢視Twitter Chainlink外部介面卡,並根據智慧合約的互動情況釋出Twitter狀態。以上就是使用OAuth和Reddit外部介面卡與智慧合約互動的第一步。你需要使用一個安裝了外部介面卡的節點,並在節點中設定身份認證資訊。歡迎大家檢視Chainlink文件 ,瞭解如何進行下一步操作。如果你使用OAuth在智慧合約中開發出了有趣的應用,請上傳至market.link ,幫助其他人也實現智慧合約與鏈下世界互動。除此之外,你還可以展示你個人的智慧合約開發實力。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;