2012-06-16 4 views
5
내가 Google 애플리케이션 스크립트 (GAS)와 REST 엔드 포인트를 사용하는 방법을 배우고

와 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; 
} 

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에있는 Logger.log입니다.

리디렉션 (OAuth에 대한 제한된 이해로 인해 나에게 맞는) 이겠지만 반환 코드는 200이고 리디렉션은 302입니까?

urlFetchApp를 사용하여 액세스 토큰을 얻을 수 있습니까?

답변

11

검색하려는 URL을 앱에서 검색하면 안됩니다. 최종 사용자를 URL로 리디렉션해야합니다. 그런 다음 최종 사용자는 앱이 데이터에 액세스 할 수있는 권한을 부여하고 Google은 사용자를 앱으로 다시 리디렉션합니다.

Google이 Google Apps Script에서 클라이언트 측 JavaScript를 실행할 수있는 기능을 제공하지 않는다고 생각하기 때문에 웹 서버 (인증 코드) 흐름을 사용하려고합니다. 즉, 사용자가 앱으로 리디렉션 될 때 URL에 인증 코드가 포함됩니다. 그런 다음 Apps Script에서 OAuth 2.0 토큰 엔드 포인트에 대한 서버 간 요청을 수행하여 OAuth 액세스 토큰에 대한 인증 코드를 교환합니다.

는 여기에 몇 가지 예제 코드입니다 (등 적절한 오류 처리없이 ..하지만 실행) :

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 '는 무엇이 될 것인가? –