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

Node.js OAuth1.0 和 OAuth2.0:Twitter API v1.1 示例

最近我們不得不進行修改以適應 Twitter API v1.1。 Twitter API v1.1 和即將被棄用的 Twitter API v1.0 之間的主要區別在於大多數 REST API 端點現在需要用戶或應用程序上下文。也就是說,每次調用都需要通過OAuth 1.0A或者OAuth 2.0認證。

Node.js OAuth

在 Storify,我們在 Node.js 上運行所有東西,所以我們使用 oauth 是很自然的 Ciaran Jessup 的模塊:NPM 和 GitHub。它很成熟,支持所有需要的功能,但缺少任何類型的示例和/或接口文檔。

以下是調用 Twitter API v1.1 的示例,以及方法列表。我希望沒有人需要挖掘 oauth 模塊源代碼了!

OAuth 1.0

讓我們從一個好的舊 OAuth 1.0A 開始。您需要四個值來向 Twitter API v1.1(或任何其他服務)發出此類請求:

  1. 您的 Twitter 應用程序密鑰,也就是消費者密鑰
  2. 您的 Twitter 密鑰
  3. 您的應用的用戶令牌
  4. 您應用的用戶密碼

所有這四個都可以在 dev.twitter.com 上為您自己的應用程序獲取。如果用戶不是您本人,您將需要執行 3-legged OAuth,或使用 Twitter 登錄或其他方式。

接下來我們創建帶有參數的 oauth 對象,並調用 get() 獲取安全資源的功能。幕後get() 函數為請求標頭構造唯一值 — Authorization 標題。該方法對簽名中的 URL、時間戳、應用程序和其他信息進行加密。因此,相同的標頭不適用於另一個 URL 或在特定時間窗口之後。

var OAuth = require('OAuth');
var oauth = new OAuth.OAuth(
      'https://api.twitter.com/oauth/request_token',
      'https://api.twitter.com/oauth/access_token',
      'your Twitter application consumer key',
      'your Twitter application secret',
      '1.0A',
      null,
      'HMAC-SHA1'
    );
    oauth.get(
      'https://api.twitter.com/1.1/trends/place.json?id=23424977',
      'your user token for this app', 
      //you can get it at dev.twitter.com for your own apps
      'your user secret for this app', 
      //you can get it at dev.twitter.com for your own apps
      function (e, data, res){
        if (e) console.error(e);        
        console.log(require('util').inspect(data));
        done();      
      });    
});

OAuth 回顯

OAuth Echo 類似於 OAuth 1.0。如果您是委託人(對服務提供者的請求由消費者委託的服務),您只需傳遞 x-verify-credentials-authorization 的值 Authorization 中的服務提供者的標頭 標題。 Twitter 在 OAuth Echo 上有很好的圖形。

OAuthEcho 從普通 OAuth 繼承必須的方法的對象 班級。如果您想編寫消費者代碼(或用於功能測試,在我們的例子中 Storify 是委託人)並且您需要 x-verify-credentials-authorization/Authorization 標頭值,有一個 authHeader 方法。如果我們看一下,我們可以很容易地用 oauth 的內部方法重建 headers _prepareParameters() 等模塊 和 _buildAuthorizationHeaders() .這是一個基於 URL 為我們提供所需值的函數(請記住,URL 是 Authorization 的一部分 標題):

  function getEchoAuth(url) { 
  //helper to construct echo/oauth headers from URL
    var oauth = new OAuth('https://api.twitter.com/oauth/request_token',
      'https://api.twitter.com/oauth/access_token',
      "AAAAAAAAAAAAAAAAAAAA",
      //test app token
      "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", 
      //test app secret
    '1.0A',
    null,
      'HMAC-SHA1');
    var orderedParams = oauth._prepareParameters(
      "1111111111-AAAAAA", //test user token
    "AAAAAAAAAAAAAAAAAAAAAAA", //test user secret
    "GET",
    url
    );
    return oauth._buildAuthorizationHeaders(orderedParams);
  }

從您的消費者代碼中,您可以使用 superagent 或其他 http 客戶端庫(例如,node.js 核心 http 模塊的 http.request)發出請求:

var request = require('super agent');

request.post('your delegator api url')
  .send({...}) 	
  //your json data
  .set(
    'x-auth-service-provider',
    'https://api.twitter.com/1.1/account/verify_credentials.json')
  .set(
    'x-verify-credentials-authorization',
    getEchoAuth("https://api.twitter.com/1.1/account/verify_credentials.json"))
  .end(function(res){console.log(res.body)});

OAuth2

與其他身份驗證方法相比,OAuth 2.0 使用起來輕而易舉。有人認為它不安全,因此請確保對所有請求都使用 SSL 和 HTTPS。

 var OAuth2 = OAuth.OAuth2;    
 var twitterConsumerKey = 'your key';
 var twitterConsumerSecret = 'your secret';
 var oauth2 = new OAuth2(
   twitterconsumerKey,
   twitterConsumerSecret, 
   'https://api.twitter.com/', 
   null,
   'oauth2/token', 
   null);
 oauth2.getOAuthAccessToken(
   '',
   {'grant_type':'client_credentials'},
   function (e, access_token, refresh_token, results){
     console.log('bearer: ',access_token);
     oauth2.get('protected url', 
       access_token, function(e,data,res) {
         if (e) return callback(e, null);
         if (res.statusCode!=200) 
           return callback(new Error(
             'OAuth2 request failed: '+
             res.statusCode),null);
         try {
           data = JSON.parse(data);        
         }
         catch (e){
           return callback(e, null);
         }
         return callback(e, data);
      });
   });

請注意JSON.parse() 函數,oauth 模塊返回字符串,而不是 JavaScript 對象。

OAuth2 的消費者不需要為每個請求獲取承載/訪問令牌。做一次並在數據庫中保存價值是可以的。因此,我們可以只用一個秘密密碼向受保護的資源(即 Twitter API v.1.1)發出請求。有關更多信息,請查看僅限 Twitter 應用程序的身份驗證。

Node.js oauth API

Node.js oauth OAuth

oauth.OAuth()

參數:

  • 請求網址
  • 訪問網址
  • 消費者密鑰
  • 消費者秘密
  • 版本
  • 授權回調
  • 簽名方法
  • nonceSize
  • 自定義標題

Node.js oauth OAuthEcho

oauth.OAuthEcho()

[旁注]

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

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

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

[旁注結束]

參數:

  • 領域
  • verify_credentials
  • 消費者密鑰
  • 消費者秘密
  • 版本
  • 簽名方法
  • nonceSize
  • 自定義標題

OAuthEcho 共享與 OAuth 相同的方法

Node.js oauth 方法

OAuth 和 OAuthEcho 類的安全 HTTP 請求方法:

OAuth.get()

參數:

  • 網址
  • oauth_token
  • oauth_token_secret
  • 回調

OAuth.delete()

參數:

  • 網址
  • oauth_token
  • oauth_token_secret
  • 回調

OAuth.put()

參數:

  • 網址
  • oauth_token
  • oauth_token_secret
  • post_body
  • post_content_type
  • 回調

OAuth.post()

參數:

  • 網址
  • oauth_token
  • oauth_token_secret
  • post_body
  • post_content_type
  • 回調

https://github.com/ciaranj/node-oauth/blob/master/lib/oauth.js

Node.js oauth OAuth2

OAuth2類

OAuth2()

參數:

  • 客戶標識
  • clientSecret
  • 基礎站點
  • 授權路徑
  • accessTokenPath
  • 自定義標題

OAuth2.getOAuthAccessToken()

參數:

  • 代碼
  • 參數
  • 回調

OAuth2.get()

參數:

  • 網址
  • access_token
  • 回調

https://github.com/ciaranj/node-oauth/blob/master/lib/oauth2.js

node.js oauth 的作者 做得很好,但目前有 32 個開放的拉取請求(我的就是其中之一),這讓我很難過。請讓他們知道我們關心改進 Node.js 的模塊生態系統和開發者社區!

更新:拉取請求已成功合併!

有用的 Twitter API v1.1 資源

只是因為它們很大而且並不總是很容易找到。

  • 對“使用 Twitter 登錄”流程的更改
  • 為推文引入新的元數據
  • REST API v1.1 每個窗口的資源限制
  • REST API v1.1 資源
  • 創建簽名
  • OAuth 回顯
  • 授權請求
  • 使用 Twitter 實現登錄
  • xAuth
  • 三足授權
  • 獲取訪問令牌
  • 僅應用程序身份驗證

工具

  • OAuth 測試服務器
  • 檢查 HTTP 請求

Tutorial JavaScript 教程
  1. PixAI DOHackathon 提交

  2. 正確學習 Redux:使用 Redux-toolkit

  3. 用聚合物建造推箱子

  4. 在 React 中製作自定義鉤子的基礎知識

  5. 向 Vite 添加測試

  6. 擴展運算符 JavaScript 的替代方案 |示例代碼

  7. 我在 MERN 堆棧中創建了 Facebook 克隆

  1. 節點文件路徑

  2. Vue CLI 初學者指南

  3. JavaScript 中的合併排序

  4. Node.js 調試

  5. 如何創建具有出色 UX 的 React 表單

  6. JavaScript 數學 pow() 函數 |獲得數字的力量

  7. JEST – 檢查對像數組是否是另一個數組的子集

  1. 免費贈品:4 個甜美且響應迅速的導航菜單

  2. 使用 K6 (k6.io) 在 GCP F1-Micro 實例上負載測試 Caddy Web 服務器

  3. 無需任何代碼即可理解 Nodejs (Javascript) 中的異步等待和承諾

  4. 使用 React 進行 Slack 克隆 |語義用戶界面 | GraphQL | PostgresSQL(第 5 部分)