0

以下は、Arun Nagarajan の例から抜粋したコードです。確認するために同じコードを試してみました..しかし、正しくインストールされていません。(以下のリダイレクト URL、クライアント 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);
}

表示されるエラーは次のとおりです: Bad request: undefined

エラーは getAndStoreAccessToken という関数内にあると思います。

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

ペイロードの正しい URL 形式を教えてください。

4

2 に答える 2

1

エラーはこの行にあるようです-

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

私はあなたが欲しいと思いますTOKEN_URL , parameters(コンマに注意してください)

于 2013-04-01T19:14:55.240 に答える
0

まず、Google Apps スクリプト内から Google ドライブにアクセスしようとしている場合、承認の目的は何ですか? Google ドライブは認証なしで利用できます。アプリケーションで他のユーザーの (または他のユーザーの代わりに) gDrive を利用しようとしていますか?

第 2 に、トラブルシューティングが非常に難しい認証を手動で実行する代わりに、認証/リクエスト プロセスを簡素化するクラス OAuthConfigを利用できます。唯一の欠点は、OAuthConfig が現在 OAuth1.0 (現在非推奨) を使用していることです。ドライブではなく Fusion Tables で特に使用されますが、このライブラリは OAuthConfig と .fetch を大いに活用し、私はそれを使用して独自の OAuth 関数をモデル化しました。以下の私の例はうまくいきます。関数は承認を設定し、 Google がバックグラウンドですべての承認作業を行っている間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();

}
于 2013-03-31T01:16:46.527 に答える