2016-04-15 5 views
6

मैं एक साधारण ट्विटर लॉगिन लिख रहा हूं और टोकन तक पहुंचने के लिए उपयोगकर्ता को रीडायरेक्ट करने के लिए अनुरोध टोकन प्राप्त करने का प्रयास कर रहा हूं लेकिन मैं हमेशा couldn't authenticate you त्रुटि के साथ समाप्त होता हूं, मैंने हस्ताक्षर जोड़ने की कोशिश की आखिरी हेडर के रूप में यह भी काम नहीं करता था। जब मैं कुछ शीर्षलेख हटा देता हूं तो मुझे खराब प्रमाणीकरण डेटा त्रुटि मिलती है इसलिए इस कॉन्फ़िगरेशन के साथ मुझे लगता है कि सबकुछ उचित है, मैं यह नहीं समझ सकता कि मैं क्या गलत कर रहा हूं और ट्विटर अनुरोध टोकन को वापस भेजने से इंकार कर देता है।ट्विटर अनुरोध_टोकन एंडपॉइंट हमेशा "आपको प्रमाणित नहीं कर सका"

यहाँ मेरी कोड

'use strict'; 
const https = require("https"); 
const cfg = require('./config'); 
// const cfg=require(`${__dirname}/config`); 
const qs = require("querystring"); 
const esc = qs.escape; 
const crypto = require('crypto'); 
const HMAC = crypto.createHmac; 
class twitter { 
    constructor(o) { 
     // if (!o || !o.consumer_key || !o.consumer_secret) throw new Error("Missing Paramaters"); 
     this.id = o.consumer_key; 
     this.secret = o.consumer_secret; 
    } 
    getNonce() { 
     let num = 32; 
     let preDefined = Date.now().toString().split(""); 
     num -= preDefined.length; 
     while (num--) { 
      preDefined.push(Math.round(Math.random() * 31).toString(32)); 
     } 
     return (new Buffer(preDefined.join("")).toString("base64")); 
    } 
    getSignature(HTTPmethod, url, parameters, tokenSecret) { 
     const method = HTTPmethod.toUpperCase(); 
     const baseUrl = url; 
     const params = parameters; 
     const sorted = Object.keys(params).sort(); 
     let baseString = `${esc(method)}&${esc(baseUrl)}`; 
     let signingKey = `${esc(this.secret)}&` 
     signingKey += tokenSecret ? esc(tokenSecret) : ""; 
     let firstRun = true; 
     sorted.forEach(param => { 
      if (firstRun) { 
       baseString += "&"; 
       firstRun = false; 
      } 
      else { 
       baseString += esc("&"); 
      } 
      baseString += esc(`${param}=${params[param]}`); 
     }); 
     return HMAC('SHA1', signingKey).update(baseString).digest('base64'); 
     // return baseString; 
    } 
    getHeaders(httpMethod, baseUrl, additional, token, tokenSecret, extraHeaders) { 
     let headers = { 
      oauth_consumer_key: this.id, 
      oauth_nonce: this.getNonce(), 
      oauth_signature_method: "HMAC-SHA1", 
      oauth_timestamp: Math.floor(Date.now()/1000), 
      oauth_version: "1.0" 
     } 
     if (extraHeaders) { 
      for (let i in extraHeaders) { 
       headers[i] = extraHeaders[i]; 
      } 
     } 
     if (token) headers.oauth_token = token; 
     let params = headers; 
     if (additional) { 
      for (let i in additional) { 
       params[i] = additional[i]; 
      } 
     } 
     // const signature = this.getSignature(httpMethod, baseUrl, params, tokenSecret || ""); 
     headers.oauth_signature = this.getSignature(httpMethod, baseUrl, params, tokenSecret || ""); 
     let header = `OAuth `; 
     let firstRun = true; 
     const sorted = Object.keys(headers).sort(); 
     sorted.forEach(i => { 
      let prefix; 
      if (firstRun) { 
       prefix = ""; 
       firstRun = false; 
      } 
      else { 
       prefix = ", "; 
      } 
      header += `${prefix}${esc(i)}="${esc(headers[i])}"` 
     }); 
     // header += `, oauth_signature="${esc(signature)}"`; 
     return header; 
    } 
    getRequestToken(cb) { 
     if (!cb) throw new Error('callback must be defined'); 
     const callbackUrl = cb; 
     let headers = this.getHeaders("POST", "https://api.twitter.com/oauth/request_token", false, false, false, { 
      oauth_callback: callbackUrl 
     }); 
     const reqParams = { 
      method: "POST", 
      host: "api.twitter.com", 
      path: "/oauth/request_token", 
      headers: { "Authorization": headers } 
     } 
     const req = https.request(reqParams, res => { 
      let data = ""; 
      res.on("data", d => data += d); 
      res.on("end", _ => console.log(data)); 
     }); req.end(); 
     console.log(req._headers); 
    } 
} 
(new twitter({ 
    consumer_key: cfg.id, 
    consumer_secret: cfg.secret 
})).getRequestToken("https://127.0.0.1/twitter"); 

उत्तर

3

कुंजी डबल basestring मापदंडों बचने था

संबंधित मुद्दे