2014-09-11 11 views
36

पहुँच (CRUD) Google डिस्क पर मैं कोशिश कर रहा हूँ से Google डिस्क एक्सेस। एक्सटेंशन जावास्क्रिप्ट में कोडित हैं, लेकिन दो मौजूदा जावास्क्रिप्ट एसडीके में से कोई भी फिट नहीं लगता है; क्लाइंट-साइड एसडीके, उम्मीद "विंडो" उपलब्ध होने की कौन से विस्तार में ऐसा नहीं है, और सर्वर साइड एसडीके, नोड-विशिष्ट सुविधाओं पर भरोसा करने लगता है एक स्क्रिप्ट है कि नोड में काम करता है अब जब मैं लोड करता है ब्राउज़र ब्राउज़र के माध्यम से इसे चलाने के बाद क्रोम में। ? मैं कच्चे बाकी कॉल का उपयोग कर अटक कर रहा हूँ नोड स्क्रिप्ट काम करता है इस तरह दिखता है:एक Firefox विस्तार से एक Firefox विस्तार

var Google = new function(){ 
    this.api = require('googleapis'); 
    this.clientID = '....'; 
    this.clientSecret = '....'; 
    this.redirectURL = 'urn:ietf:wg:oauth:2.0:oob'; 
    this.scope = 'https://www.googleapis.com/auth/drive.file'; 
    this.client = new this.api.auth.OAuth2(this.clientID, this.clientSecret, this.redirectURL); 
    } 
} 

जो तब के बाद का उपयोग कर कहा जाता है:

var google = require('googleapis'); 
var readlineSync = require('readline-sync'); 

var CLIENT_ID = '....', 
    CLIENT_SECRET = '....', 
    REDIRECT_URL = 'urn:ietf:wg:oauth:2.0:oob', 
    SCOPE = 'https://www.googleapis.com/auth/drive.file'; 

var oauth2Client = new google.auth.OAuth2(CLIENT_ID, CLIENT_SECRET, REDIRECT_URL); 

var url = oauth2Client.generateAuthUrl({ 
    access_type: 'offline', // 'online' (default) or 'offline' (gets refresh_token) 
    scope: SCOPE // If you only need one scope you can pass it as string 
}); 

var code = readlineSync.question('Auth code? :'); 

oauth2Client.getToken(code, function(err, tokens) { 
    console.log('authenticated?'); 
    // Now tokens contains an access_token and an optional refresh_token. Save them. 
    if(!err) { 
    console.log('authenticated'); 
    oauth2Client.setCredentials(tokens); 
    } else { 
    console.log('not authenticated'); 
    } 
}); 

मैं इस स्क्रिप्ट पर browserify का उपयोग कर नोड GDrive एसडीके लपेट एक बटन क्लिक (यह ब्राउज़र की शुरूआत करता है, तो पाठ क्षेत्र कोई कोड है एक पाने के लिए):

function authorize() { 
    var code = document.getElementById("code").value.trim(); 

    if (code === '') { 
    var url = Google.client.generateAuthUrl({access_type: 'offline', scope: Google.scope}); 
    var win = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService(Components.interfaces.nsIWindowMediator).getMostRecentWindow('navigator:browser'); 
    win.gBrowser.selectedTab = win.gBrowser.addTab(url); 
    } else { 
    Google.client.getToken(code, function(err, tokens) { 
     if(!err) { 
     Google.client.setCredentials(tokens); 
     // store token 
     alert('Succesfully authorized'); 
     } else { 
     alert('Not authorized: ' + err); // always ends here 
     } 
    }); 
    } 
} 

लेकिन इस त्रुटि पैदावार Not authorized: Invalid protocol: https:

+०१२३५१६४१०६१
+2

@friflaj क्या आपने विंडो ओबीजे की नकल करने की कोशिश की थी? 'विंडो = विंडो = {} 'एक उच्च स्तर का निर्माण करता है ऐसा लगता है कि वे ग्लोबल वेरिएबल – yoelp

+0

स्टोर करने के लिए केवल Winodw obj का उपयोग करते हैं, यही वह है जो मैं अभी कोशिश कर रहा हूं। नोड संस्करण गतिशील मॉड्यूल लोडिंग का एक रूप उपयोग करता है जो ब्राउज़र को बचने के लिए प्रतीत होता है, इसलिए मैंने इसे छोड़ दिया है। – retorquere

+0

क्या आपने आईफ्रेम का उपयोग करने का प्रयास किया है? मैं फ़ायरफ़ॉक्स में विश्वास करता हूं कि आपके पास "पृष्ठभूमि स्क्रिप्ट" तक पहुंच है। यह मूल रूप से एक हेडलेस एचटीएमएल पेज है जिसे आपका कोड निष्पादित किया जाता है। आपको यहां एक आईफ्रेम उत्पन्न करने में सक्षम होना चाहिए। (बस स्पिटबॉलिंग, मुझे यह पहले काम करने के लिए मिला है, लेकिन याद नहीं कर सकता) कैसे –

उत्तर

1

हालांकि यह संभव है, उपयोग के मामले पर निर्भर करता है, यह सीमित ब्याज की भी हो सकता है।

एक छोटे http सर्वर के साथ फ़ायरफ़ॉक्स जहाजों, बस नंगे हड्डियों। इसे परीक्षण उद्देश्यों के लिए शामिल किया गया है लेकिन यह इसे अनदेखा करने का कोई कारण नहीं है।

quickstart guide for running a Drive app in Javascript

मुश्किल हिस्सा पुनर्निर्देशन यूआरआई और जावास्क्रिप्ट मूल स्थापित करने के लिए है का पालन करने देता है। जाहिर है सही सेटिंग http://localhost है, लेकिन आप कैसे सुनिश्चित करें कि प्रत्येक उपयोगकर्ता पोर्ट 80 उपलब्ध है कि हो सकता है?

आप तब तक नहीं कर सकते जब तक कि आपके उपयोगकर्ताओं पर नियंत्रण न हो, कोई भी बंदरगाह हर किसी के लिए काम करने की गारंटी नहीं देता है। इस बात को ध्यान में रखते हुए पोर्ट 49870 चुनें और प्रार्थना करें।

तो अब पुन: निर्देशित यूआरआई और जावास्क्रिप्ट मूल आप उपयोग एड-ऑन एसडीके, बचाने मान लिया जाये कि http://localhost:49870

की तैयारी में हैं quickstart.html अपने विस्तार के data निर्देशिका में (अपने ग्राहक आईडी जोड़ने के लिए याद)। अब संपादित अपने main.js

const self = require("sdk/self"); 
const { Cc, Ci } = require("chrome"); 
const tabs = require("sdk/tabs"); 
const httpd = require("sdk/test/httpd"); 

var quickstart = self.data.load("quickstart.html"); 

var srv = new httpd.nsHttpServer(); 

srv.registerPathHandler("/gdrive", function handler(request, response){ 
    response.setHeader("Content-Type", "text/html; charset=utf-8", false); 

    let converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter); 
    converter.charset = "UTF-8"; 
    response.write(converter.ConvertFromUnicode(quickstart)); 
}) 

srv.start(49870); 

tabs.open("http://localhost:49870/gdrive"); 

exports.onUnload = function (reason) { 
    srv.stop(function(){}); 
}; 

सूचना है कि quickstart.html एक resource: यूआरआई के साथ एक स्थानीय फ़ाइल के रूप में खोला नहीं है,। ड्राइव एपीआई इसे पसंद नहीं करेगा। यह यूआरएल http://localhost:49870/gdrive पर परोसा जाता है। कहने की जरूरत नहीं है कि स्थैतिक एचटीएमएल के बजाय हम एक टेम्पलेट या किसी और चीज का उपयोग कर सकते हैं। इसके अलावा http://localhost:49870/gdrive को नियमित पेजमॉड के साथ स्क्रिप्ट किया जा सकता है।

मैं इसे एक वास्तविक समाधान नहीं मानता।यह कुछ भी नहीं से बेहतर है।

+0

जैसा कि होता है, मैं इसे ज़ोटरो एक्सटेंशन के लिए कर रहा हूं, ... और ज़ोटरो जहाजों को एक सेवा योग्य http सर्वर एम्बेडेड के साथ कर रहा हूं, इसलिए इसे काम करना चाहिए। मैंने Google को स्थानीयहोस्ट रीडायरेक्ट यूआरआई स्वीकार करने की उम्मीद नहीं की थी – retorquere

1

यहाँ https://developer.mozilla.org/en/docs/Working_with_windows_in_chrome_code से आप window = window || content || {}

उपयोग जावास्क्रिप्ट ग्राहक एपीआई और नहीं Node.js ग्राहक की कोशिश कर सकते। हालांकि ब्राउज़रीकरण इसे काम करेगा। आपको बाद में अपने ग्राहक रहस्य का पर्दाफाश करना होगा। क्लाइंट साइड प्रमाणीकरण का प्रवाह सर्वर की तरफ से बहुत अलग है। https://developers.google.com/accounts/docs/OAuth2

का संदर्भ लें यह सब कहा करने के बाद। आरईएसटी आधारित कॉल के साथ ऐप को कार्यान्वित करना वास्तव में मुश्किल नहीं है। सभी क्लाइंट पुस्तकालयों में विधियां संबंधित आरईएसटी यूआरएल की नकल करती हैं। आप अनुरोध और प्रतिक्रिया को संभालने के लिए अपने आप के कुछ कार्यों को स्थापित कर सकते हैं और शेष वही महसूस करेंगे।

+0

@friflaj सही के रूप में चिह्नित करने के लिए धन्यवाद। क्या कोड स्निपेट आपके लिए काम से ऊपर था या आपने मूल REST का प्रयास किया था? –

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