2012-06-16 12 views
5

मैं कैसे Google Apps स्क्रिप्ट (गैस) के साथ बाकी अंतिमबिंदुओं उपयोग करने के लिए सीख रहा हूँ के साथ UrlFetchApp का उपयोग कर कैसे मिलता है और उदाहरण hereमैं पहुंच टोकन गैस

मैं गूगल का उपयोग कर रहा तरह पहुंच टोकन प्राप्त करना चाहते हैं साइटें, यहाँ स्क्रिप्ट

function doGet(e) { 
    var app = UiApp.createApplication().setTitle('test OAuth 2.0'); 

    var mainPanel = app.createVerticalPanel(); 
    app.add(mainPanel); 

    var url = "https://accounts.google.com/o/oauth2/auth" + 
        "?scope=https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile" + 
        "&state=/profile" + 
        "&redirect_uri=http://<mySite>.com/gas/home/oauth2apis" + 
        "&response_type=token" + 
        "&client_id=812741506391.apps.googleusercontent.com" + 
        "&approval_prompt=force"; 
    Logger.log("encodeURI(url):"+encodeURI(url)); 

    try{ 
    var response = UrlFetchApp.fetch(encodeURI(url)); 
    }catch(e){ 
    Logger.log("caught this:" + e); 
    } 

    Logger.log("Response code:"+response.getResponseCode()); 
    Logger.log("X-Auto-Login Response code:"+response.getHeaders()); 

    var returned = app.createTextArea().setHeight(600).setValue(response.getContentText()); 
    mainPanel.add(returned); 
    return app; 
} 

और Logger.log

Response code:200 
X-Auto-Login Response code:({'Cache-control':"no-cache, no-store", Expires:"Mon, 01-Jan-1990 00:00:00 GMT", 'X-XSS-Protection':"1; mode=block", 'Set-Cookie':"GALX=m0d9oxyH-kQ;Path=/;Secure", 'X-Google-Cache-Control':"remote-fetch", Server:"GSE", Pragma:"no-cache", 'X-Content-Type-Options':"nosniff", 'X-Frame-Options':"Deny", 'X-Auto-Login':"realm=com.google&args=service%3Dlso%26continue%3Dhttps%253A%252F%252Faccounts.google.com%252Fo%252Foauth2%252Fauth%253Fresponse_type%253Dtoken%2526scope%253Dhttps%253A%252F%252Fwww.googleapis.com%252Fauth%252Fuserinfo.email%252Bhttps%253A%252F%252Fwww.googleapis.com%252Fauth%252Fuserinfo.profile%2526redirect_uri%253Dhttp%253A%252F%252F<mySite>.com%252Fgas%252Fhome%252Foauth2apis%2526approval_prompt%253Dforce%2526state%253D%252Fprofile%2526client_id%253D812741506391.apps.googleusercontent.com%2526hl%253Den-US%2526from_login%253D1%2526as%253D6991e98fb6d20df3", 'Strict-Transport-Security':"max-age=2592000; includeSubDomains", Date:"Sat, 16 Jun 2012 12:46:26 GMT", Via:"HTTP/1.1 GWA", 'Content-Type':"text/html; charset=UTF-8"}) 

mysite मैप किया और DNS में किया जाता है।

ऐसा लगता है कि यह एक रीडायरेक्ट करने की कोशिश कर रहा है (जो मुझे OAuth की सीमित समझ के साथ समझ में आता है) लेकिन रिटर्न कोड 200 है और रीडायरेक्ट 302 है?

क्या मैं एक्सेस टोकन प्राप्त करने के लिए urlFetchApp का उपयोग कर सकता हूं?

उत्तर

11

जिस URL को आप पुनर्प्राप्त करने का प्रयास कर रहे हैं उसे आपके ऐप द्वारा पुनर्प्राप्त नहीं किया जाना चाहिए - आपको अंतिम उपयोगकर्ता को URL पर रीडायरेक्ट करने की आवश्यकता है। अंत उपयोगकर्ता तब आपके ऐप को अपने डेटा तक पहुंचने की क्षमता प्रदान करता है, और फिर Google उपयोगकर्ता को आपके ऐप पर रीडायरेक्ट करेगा।

चूंकि मुझे विश्वास नहीं है कि Google Google Apps स्क्रिप्ट से क्लाइंट-साइड जावास्क्रिप्ट चलाने की क्षमता प्रदान करता है, तो आप वेब सर्वर (प्राधिकरण कोड) प्रवाह का उपयोग करना चाहते हैं। इसका अर्थ यह है कि यूआरएल में एक प्राधिकरण कोड होगा जब उपयोगकर्ता को आपके ऐप पर रीडायरेक्ट किया जाएगा। फिर आप ओएथ एक्सेस टोकन के लिए प्राधिकरण कोड का आदान-प्रदान करने के लिए ऐप्स स्क्रिप्ट से OAuth 2.0 टोकन एंडपॉइंट पर सर्वर-टू-सर्वर अनुरोध करते हैं।

यहाँ कुछ उदाहरण कोड है (उचित त्रुटि हैंडलिंग, आदि के बिना .. लेकिन यह चलाता है):

function doGet(e) { 
    var scriptUri = "https://docs.google.com/macros/s/AKfycbzg1LZIqKlKu5f7TtRL4VuleEjExXVCEqH15fI3/exec"; 
    var clientId = "764634415739.apps.googleusercontent.com"; 
    var clientSecret = "XXXXXXX-YYYYYYYYY"; 
    var scope = "https://www.googleapis.com/auth/plus.me"; 


    var app = UiApp.createApplication().setTitle(""); 
    var div = app.createVerticalPanel(); 

    if (e.parameter && e.parameter.code) { 
    var redirectUri = scriptUri; 
    var tokenEndpoint = "https://accounts.google.com/o/oauth2/token"; 

    var postPayload = { 
     "code" : e.parameter.code, 
     "client_id" : clientId, 
     "client_secret" : clientSecret, 
     "redirect_uri" : redirectUri, 
     "grant_type" : "authorization_code" 
    }; 

    var options = { 
     "method" : "post", 
     "payload" : postPayload 
    }; 

    // do a URL fetch to POST the authorization code to google 
    // and get an access token back 
    var response = UrlFetchApp.fetch(tokenEndpoint, options); 
    var tokenData = Utilities.jsonParse(response.getContentText()); 

    // call the Google+ API and get response 
    var plusOptions = { 
     "headers" : { 
     "Authorization" : "Bearer " + tokenData.access_token 
     } 
    }; 
    var plusResponse = UrlFetchApp.fetch(
     "https://www.googleapis.com/plus/v1/people/me", plusOptions); 
    var plusData = Utilities.jsonParse(plusResponse.getContentText()); 

    div.add(app.createLabel(plusData.displayName)); 
    div.add(app.createLabel(plusData.url)); 

    } else { 
    // ask user to go over to Google to grant access 
    var redirectUri = scriptUri; 
    var url1 = "https://accounts.google.com/o/oauth2/auth?client_id=" + clientId + 
     "%26response_type=code" + 
     "%26scope=" + scope + 
     "%26redirect_uri=" + redirectUri; 
    div.add(app.createAnchor('Grant data access at Google',url1)); 
    } 
    app.add(div); 


    return app; 
} 

यहाँ कार्रवाई में कोड है: https://docs.google.com/macros/s/AKfycbzg1LZIqKlKu5f7TtRL4VuleEjExXVCEqH15fI3/exec

+0

!!! मैं तैयार हूं। धन्यवाद! –

+0

'e.parameter.code' वास्तव में क्या होगा या प्रतिनिधित्व करेगा? –

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