JavaScript >> Javascript 文檔 >  >> Node.js

使用 Node.js 介紹 OAuth:OAuth 1.0(單腿)

此文本是 Node.js 的 OAuth 簡介 的一部分 gum.co/hRyc 上提供的迷你書。

使用 Node.js 介紹 OAuth:Twitter API OAuth 1.0、OAuth 2.0、OAuth Echo、Everyauth 和 OAuth 2.0 服務器示例

讓我們從良好的舊 OAuth 1.0 開始。它通常的工作方式如下:

  1. 當我們第一次授權用戶使用我們的應用時,我們需要執行額外的工作並獲取訪問令牌和密鑰(三足)。
  2. 您為應用中的每個用戶存儲這些值。
  3. 然後,在隨後的請求中,事情變得更加簡單。我們構建身份驗證標頭並發出 HTTP 請求(單腿)。

在本章中,將只處理那些後面的單腿請求,如圖 1-1 所示,而前面的三腿方法將在 Everyauth 章節中介紹,即從簡單到復雜的構建。

圖 1-1:OAuth 1.0A(單腿)架構

Twitter 提供 OAuth 工具來為您自己的應用程序生成令牌和機密。這就是我們將用於請求的內容。您需要四個值來向 Twitter API v1.1 或使用 OAuth 1.0 的任何其他服務發出 OAuth 1.0 請求:

  1. 應用程序密鑰,即消費者密鑰
  2. 應用密鑰
  3. 此應用的用戶令牌
  4. 此應用程序的用戶密碼

所有這四個都可以在 dev.twitter.com 上為您自己的應用程序獲取,如圖 1-2 所示。

圖 1-2:dev.twitter.com 主頁

重申一下,如果您不是用戶(這是最常見的用例),您需要執行三足 OAuth / 使用 Twitter 或其他方式登錄。 使用 Twitter 登錄的結果 是帶有用戶令牌和秘密的響應,可以存儲在應用程序數據庫中以供以後使用。有關更多信息,請按照 Everyauth 章節中的示例進行操作。

返回獲取密鑰,單擊右上角的“登錄”,您將看到您的 Twitter 應用程序列表(如果有)。 您自己的應用程序 指您使用 Twitter 帳戶創建的應用程序。例如,圖 1-3 中顯示了三個應用程序。

圖 1-3:Twitter API 應用程序

為了這個練習,簡單地創建一個全新的應用程序並為其獲取令牌和秘密會更容易。點擊創建新應用 從圖 1-3 的屏幕截圖,它會帶你到頁面創建一個應用程序 ,如圖1-4所示。

填寫 Name、Description、Website 和 Callback URL 的值(不管是什麼,只要以 http:// 開頭即可 )。回調值可以是任何值,但如果為空,則 Twitter 應用將被鎖定為 OOB 模式,這將阻止我們稍後測試 OAuth 登錄(您將看到 Desktop applications only support the OAuth_callback value 'oob' 錯誤)。因此,請將任何 URL 放入回調字段中,例如 http://webapplog.com .

圖 1–4:創建 Twitter 應用程序

創建應用後,轉到權限 選項卡,然後將權限更改為讀取、寫入和訪問直接消息 .這將為 訪問級別 生成一個新值 API Keys 的字段 選項卡,如圖 1-5 所示。在同一選項卡中,單擊按鈕創建我的訪問令牌 .生成完成後,結果將在您的訪問令牌中 部分,如圖 1-5 所示。請注意,您的密鑰與插圖不同。

圖 1–5:您自己的應用程序的訪問令牌和密鑰

生成值後(可能需要一些時間),複製並存儲這些值:

  1. API 密鑰:twitterKey 在 Node.js 腳本中
  2. API 密碼:twitterSecret 在 Node.js 腳本中
  3. 訪問令牌:token 在 Node.js 腳本中
  4. 訪問令牌密碼:secret 在 Node.js 腳本中

有許多 Node.js OAuth 模塊,甚至還有 Node.js Twitter SDK(Twitter API 的包裝器)。但是,要了解發出 OAuth 請求的基礎知識,我們將使用最簡約的模塊 oauth .該模塊將幫助我們為 HTTP 請求構建 auth 標頭,而無需了解構建標頭所需的所有復雜性。

要授權一個請求,它的 Authorization 中必須有某些參數 標頭(文檔),例如:

OAuth oauth_consumer_key="xvz1evFS4wEEPTGEFPHBog", oauth_nonce="kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg", oauth_signature="tnnArxj06cWHq44gCs1OSKk%2FjLY%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1318622958", oauth_token="370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb", oauth_version="1.0"

讓我們簡單看一下這些參數:

[旁注]

閱讀博客文章很好,但觀看視頻課程更好,因為它們更具吸引力。

許多開發人員抱怨 Node.js 上缺乏負擔得起的高質量視頻材料。觀看 YouTube 視頻會讓人分心,花 500 美元購買 Node 視頻課程很瘋狂!

去看看 Node University,它有關於 Node 的免費視頻課程:node.university。

[旁注結束]

  • oauth_consumer_key :這與應用程序密鑰或 Twitter 消費者密鑰相同,即您的應用程序的唯一標識符
  • oauth_nonce :請求的唯一標識符,通常使用一些隨機參數和散列算法構造
  • oauth_timestamp :自 Unix 紀元以來的當前時間(以秒為單位)
  • oauth_version :應該總是 1.0 對於 OAuth 1.0
  • oauth_signature_method :應該是 HMAC-SHA1
  • oauth_signature :所有其他參數的散列組合

這些參數的確切生成超出了這本介紹性書籍的範圍。幸運的是,有許多模塊可以為我們完成這項工作,即 oauth .

安裝 oauth 模塊,你可以使用:

$ npm install [email protected]

oauth1/index.js 文件中,我們定義了密鑰、令牌和秘密的變量。 替換字符串佔位符 用你的價值觀:

var twitterKey = 'your Twitter application consumer key',
  twitterSecret = 'your Twitter application secret',
  token = 'your user token for this app',
  secret = 'your user secret for this app';

以下只是一個示例 關鍵格式的外觀。請使用你自己的,因為這些值會失效:

twitterKey = 'A3UP583JRnLWuAdeMUBJjzOn2';
twitterSecret = 'tQEu1d0cMU43hk2hk5J77UhIweJ7z4oEPVl6OhxbMRONtLMLMG';
token = '575632191-r98rIwyKnAxTHFt86bKX5ZaFeYRzmfOF5JbaPyPI';
secret = 'eryuMTstgYrcerrL43XwVX1EAOJMTdQxvGKHu5UUSiBY7';

回到我們的文件(oauth1/index.js ),我們導入 OAuth 類並為 OAuth 1.0 創建一個對象,其中參數是 Twitter API 端點、密鑰和秘密;版本(1.0A);及加密方式(HMAC-SHA1):

var OAuth = require('OAuth');
var oauth = new OAuth.OAuth(
  'https://api.twitter.com/oauth/request_token',
  'https://api.twitter.com/oauth/access_token',
  twitterKey,
  twitterSecret,
  '1.0A',
  null,
  'HMAC-SHA1'
);

在我們創建 oauth 之後 使用參數的對象,我們可以調用 aouth.get() 獲取安全資源的功能。該函數接受 URL、用戶令牌、用戶密碼(不要將此密碼與 Twitter 密碼混淆)和回調:

oauth.get(
  'https://api.twitter.com/1.1/trends/place.json?id=23424977',
  token,
  secret,
  function (error, data, response){
    if (error) console.error(error);
    data = JSON.parse(data);
    console.log(JSON.stringify(data, 0, 2));
});

在幕後,get() 函數為請求標頭構造唯一值 — Authorization 標題。該方法對簽名中的 URL、時間戳、應用程序和其他信息進行加密,因此相同的標頭不適用於另一個 URL 或在特定時間窗口之後。

在回調函數中,我們解析 data 將字符串轉換為 JavaScript 對象,然後使用 JSON.stringify 以縮進方式打印它 參數。回調的最後一個參數,response ,會有響應信息和headers。

oauth1/index.js的完整源代碼 :

var twitterKey = 'your Twitter application consumer key',
  twitterSecret = 'your Twitter application secret',
  token = 'your user token for this app',
  //you can get it at dev.twitter.com for your own apps
  secret = 'your user secret for this app';
  //you can get it at dev.twitter.com for your own apps

var OAuth = require('OAuth');

var oauth = new OAuth.OAuth(
  'https://api.twitter.com/oauth/request_token',
  'https://api.twitter.com/oauth/access_token',
  twitterKey,
  twitterSecret,
  '1.0A',
  null,
  'HMAC-SHA1'
);

oauth.get(
  'https://api.twitter.com/1.1/trends/place.json?id=23424977',
  token,
  secret,
  function (error, data, response){
    if (error) console.error(error);
    // data = JSON.parse(data);
    // console.log(JSON.stringify(data, 0, 2));
    console.log(response);
});

當您使用 $ node index.js 運行文件時 ,您應該會看到來自受保護 Twitter API 端點的數據,例如,給定位置的十大熱門話題(WOEID 查找)通過 trends/place 端點:

https://api.twitter.com/1.1/trends/place.json?id=23424977

趨勢文檔可在 https://dev.twitter.com/docs/api/1.1/get/trends/place 獲得。結果可能如下所示:

[
  {
    "trends": [
      {
        "name": "#WorldCup",
        "query": "%23WorldCup",
        "url": "http://twitter.com/search?q=%23WorldCup",
        "promoted_content": null
      },
      {
        "name": "Kershaw",
        "query": "Kershaw",
        "url": "http://twitter.com/search?q=Kershaw",
        "promoted_content": null
      },
      {
        "name": "#RE2PECT",
        "query": "%23RE2PECT",
        "url": "http://twitter.com/search?q=%23RE2PECT",
        "promoted_content": null
      },
      ...
            {
        "name": "Starbucks",
        "query": "Starbucks",
        "url": "http://twitter.com/search?q=Starbucks",
        "promoted_content": null
      }
    ],
    "as_of": "2014-07-14T17:45:52Z",
    "created_at": "2014-07-14T17:41:24Z",
    "locations": [
      {
        "name": "United States",
        "woeid": 23424977
      }
    ]
  }
]

Tutorial JavaScript 教程
  1. 如何使用 Hooks 和 Portal 在 React 中創建高效的 Modal 組件

  2. DOM 事件監聽器

  3. odo 2.0 中的 Kubernetes 集成等

  4. 使用 contextMenu.js 庫製作自定義上下文菜單

  5. JavaScript 的基本語法

  6. 在頁面加載時啟動引導模式

  7. 對象 hasOwnProperty() 方法

  1. JavaScript 設計模式:外觀

  2. HTML5 的 window.postMessage API

  3. Expo ReactNative 不在局域網上工作

  4. NodeSource 聚會 - Node.js 中的流和承諾 - 2017 年 1 月

  5. daisyUI:用於減少標記的 Tailwind CSS 組件

  6. .map() .forEach() for()。 👉 創建數組並推送的三種方式:

  7. 解決方案:求和到目標的子矩陣的數量

  1. 有用的 Lodash 數組函數 — 填充和查找

  2. Laravel 8、Vue 3 和 Tailwind 入門

  3. 使用 React 和 GatsbyJs 構建網站

  4. 輸入類型號 - 最大值