2013-03-29 26 views
0

以下是從Arun Nagarajan的示例中獲取的代碼示例:我試着使用相同的代碼來檢查。但它沒有正確安裝。 (我在下面刪除了我的重定向網址,客戶端ID和密碼)。請告訴我下面的代碼有什麼問題。從應用程序腳本構建驅動器應用程序 - 以下代碼中出現什麼錯誤

var AUTHORIZE_URL = 'https://accounts.google.com/o/oauth2/auth'; 
var TOKEN_URL = 'https://accounts.google.com/o/oauth2/token'; 
var REDIRECT_URL =    'exec'; 
var tokenPropertyName = 'GOOGLE_OAUTH_TOKEN'; 

var CLIENT_ID = ''; 
var CLIENT_SECRET = ''; 

function doGet(e) { 
var HTMLToOutput; 

if(e.parameters.state){ 
var state = JSON.parse(e.parameters.state); 
if(state.action === 'çreate'){ 
var meetingURL = createMeetingNotes(); 
HTMLToOutput = '<html><h1>Meeting notes document created!</h1><a href="'+meetingURL+'"> <click here to open</a></html>'; 
} 
else if (state.ids){ 
var doc = DocsList.getFileById(state.ids[0]); 
var url = doc.getContentAsString(); 
HTMLToOutput = '"<html><a href="' +url+'"</a></html>"'; 
} 
else { 
zipAndSend(state.ecportIds.Session.getEffectUser().getEmail()); 
HTMLToOutput = '"<html><h1>Email sent. Check your Inbox.</h1></html>"'; 
} 
} 
else if(e.parameters.code){ 
getAndStoreAccessToken(e.parameters.code); 
HTMLToOutput = '<html><h1>App is installed. You can close this window now or navigate to your </h1><a href="https://drive.google.com/">Google Drive</a></html>'; 
} 
else { 
HTMLToOutput = '<html><h1>Install this App into your google drive </h1><a href="' + getURLForAuthorization() + '">Click here to start install</a></html>'; 
} 

return HtmlService.createHtmlOutput(HTMLToOutput); 

} 

function getURLForAuthorization() { 
return AUTHORIZE_URL + '?response_type=code&client_id=' + CLIENT_ID + '&redirect_uri='  + REDIRECT_URL + '&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.install+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email'; 
} 

function getAndStoreAccessToken(code) { 
var parameters = { method : 'post', 
        payload : 'client_id='+ CLIENT_ID + '&client_secret=' + CLIENT_SECRET + '&grant_type=authorization.code&redirect_uri=' + REDIRECT_URL}; 
var response = UrlFetchApp.fetch(TOKEN_URL.parameters).getContentText(); 
var tokenResponse = JSON.parse(response); 
UserProperties.getProperty(tokenPropertyName, tokenResponse.access_token); 
} 

function getUrlFetchOptions() { 
return {'contentType' : 'application/json', 
     'headers' : {'Authorization': 'Bearer ' +   UserProperties.getProperty(tokenPropertyName), 
        'Accept' : 'application/json'}};   

} 

function IsTokenValid() { 
return UserProperties.getProperty(tokenPropertyName); 
} 

錯誤顯示爲:壞請求:未定義

我認爲錯誤是調用的函數裏面:getAndStoreAccessToken。

var parameters = { method : 'post', 
payload : 'client_id='+ CLIENT_ID + '&client_secret=' + CLIENT_SECRET + '&grant_type=authorization.code&redirect_uri=' + REDIRECT_URL}; 

請告訴我正確的負載url格式。

+0

我建議你不要在網上發佈你的實際CLIENT_SECRET。 – Brian

回答

0

首先,如果您嘗試從谷歌應用程序腳本訪問Google Drive,授權的目的是什麼?谷歌驅動器可用W/O授權。您是否試圖讓您的應用程序使用其他用戶的gDrive(或代表其他用戶)?

其次,您可以利用簡化授權/請求過程的Class OAuthConfig,而不是手動執行授權,這很難排除故障。唯一的缺點是OAuthConfig目前使用OAuth1.0(目前已被棄用)。雖然它特別適用於Fusion Tables,而不是驅動器,但是this library很好地利用了OAuthConfig和.fetch,我用它來建模我自己的OAuth功能。我的下面的例子很好。 googleAuth()函數設置授權,然後應用程序的其餘部分可以使用UrlFetchApp.fetch(url,options)進行授權請求,而谷歌則在後臺執行所有授權任務。

function googleAuth(oAuthFields) { 
     var oAuthConfig = UrlFetchApp.addOAuthService(oAuthFields.service); 
     oAuthConfig.setRequestTokenUrl("https://www.google.com/accounts/"+ 
       "OAuthGetRequestToken?scope=" + oAuthFields.scope); 
     oAuthConfig.setAuthorizationUrl("https://www.google.com/accounts/OAuthAuthorizeToken"); 
     oAuthConfig.setAccessTokenUrl("https://www.google.com/accounts/OAuthGetAccessToken"); 
     oAuthConfig.setConsumerKey(oAuthFields.clientId); 
     oAuthConfig.setConsumerSecret(oAuthFields.clientSecret); 
     return {oAuthServiceName:oAuthFields.service, oAuthUseToken:"always"}; 
} 
function fusionRequest(methodType, sql, oAuthFields, contentType) { 
    var fetchArgs = OAL.googleAuth(oAuthFields); 
    var fetchUrl = oAuthFields.queryUrl; 
    fetchArgs.method = methodType; 
    if(methodType == 'GET') { 
    fetchUrl += '?sql=' + sql; 
    fetchArgs.payload = null; 
    } else{ 
    fetchArgs.payload = 'sql='+sql; 
    } 
    if(contentType != null) fetchArgs.contentType = contentType; 
    Logger.log(UrlFetchApp.getRequest(oAuthFields.queryUrl, fetchArgs)); 
    var fetchResult = UrlFetchApp.fetch(oAuthFields.queryUrl, fetchArgs); 

    if(methodType == 'GET') return JSON.parse(fetchResult.getContentText()); 
    else return fetchResult.getContentText(); 

} 
1

的錯誤似乎在這條線 -

var response = UrlFetchApp.fetch(TOKEN_URL.parameters).getContentText(); 

我想你想TOKEN_URL , parameters(注意逗號)

相關問題