2016-08-26 11 views
0

解決済み!GoogleドライブAPIを呼び出すとInvalid_grant OAuth2が返されます

問題は私のコードではありませんでした。 Linuxサーバーで手動で時刻を設定すると、Googleのサーバーが私にアクセスを許可しないということになりました。私は時間を設定することが私のサーバー上で次のコマンドを使用:ntpdate 0.europe.pool.ntp.org

オリジナル問題:

私は現在、Googleスプレッドシートからいくつかの値を読み取りNodeJS、中に小さなスクリプトを開発しようとし、そしてそれを書きますよJSON形式のファイルに変換します。

私のMacでは問題なく機能していますが、Ubuntu 14.04.4にアップロードした後、「google-spreadsheet」モジュールの機能の一部が動作しておらず、定義されていません。

ノードモジュールに問題があるかどうか、または自分のコードに問題があるかどうかは100%確信していません。

コールを行うコード:

var GoogleSpreadsheet = require('google-spreadsheet'); 
var fs = require('fs'); 

function scheduleBidding(sheetSecretKey) { 
    this.sheetKey = sheetSecretKey; 
} 

scheduleBidding.prototype.getBiddingHeaders = function (filePrefix) { 
var doc = new GoogleSpreadsheet(this.sheetKey); 
var sheet; 
var daysSinceYearStart = getDaysIntoYear(); 
var localSheetKey = this.sheetKey; 
var biddingObject = new Object(); 
var filePath = filePrefix+"staticConfigFiles/googleApiKey"; 
console.log(filePath); 
fs.readFile(filePath, 'utf8', function (err, data) { 
    creds = JSON.parse(data); 
    console.log(creds); 
    doc.useServiceAccountAuth(creds, function (err) { 
     if(err) throw err; 
     doc.getInfo(function (err, info) { 
      if(err) throw err; 
      console.log(info); 
      sheet = info.worksheets[0]; 
      var numberOfColumns = sheet.colCount; 
      sheet.getCells({ 
       'min-row': 1, 
       'max-row': 1, 
       'min-col': 2, 
       'max-col': numberOfColumns, 
       'return-empty': true 
      }, function(err, cells) { 
       sheet.getRows({ 
        offset: 1, 
        limit: 366 
       }, function(err, rows){ 
        yesterdaysBid = rows[daysSinceYearStart-2]; 
        todaysBidding = rows[daysSinceYearStart-1]; 
        cells.forEach(function (listItem, indexArray) { 
         columnName = cells[indexArray].value; 
         var functionName = String(columnName.toLowerCase()); 
         functionName = functionName.replace(/\s/g, '').replace(":", ""); 
         biddingObject[columnName] = { 
          "yesterdaysBid": yesterdaysBid[functionName], 
          "todaysBid": todaysBidding[functionName] 
         }; 
         newFileName = filePrefix+"scheduleData/"+localSheetKey+".json"; 
         prettyJson = JSON.stringify(biddingObject); 
         fs.writeFile(newFileName, prettyJson); 
         console.log("ScheduleBidding JSON has been updated"); 
        }); 
       }); 
      }); 
     }); 
    }); 
}); 

function getDaysIntoYear() { 
    var todaysDate = new Date(); 
    var daysAgo; 

    // 
    returnDays = parseInt(todaysDate.getDate())+daysAgo; 
    return returnDays; 
} 
}; 

私はUbuntuのサーバー上でスクリプトを実行したときに、私は次の例外を受け取る:助けを事前に

Error: invalid_grant 
www-0  at Request._callback (/SomePath/node_modules/google-spreadsheet/node_modules/google-auth-library/node_modules/gtoken/lib/index.js:215:34) 
www-0  at Request.self.callback (/SomePath/node_modules/google-spreadsheet/node_modules/google-auth-library/node_modules/gtoken/node_modules/request/request.js:187:22) 
www-0  at Request.EventEmitter.emit (events.js:98:17) 
www-0  at Request.<anonymous> (/SomePath/node_modules/google-spreadsheet/node_modules/google-auth-library/node_modules/gtoken/node_modules/request/request.js:1044:10) 
www-0  at Request.EventEmitter.emit (events.js:95:17) 
www-0  at IncomingMessage.<anonymous> (/SomePath/node_modules/google-spreadsheet/node_modules/google-auth-library/node_modules/gtoken/node_modules/request/request.js:965:12) 
www-0  at IncomingMessage.EventEmitter.emit (events.js:117:20) 
www-0  at _stream_readable.js:920:16 
www-0  at process._tickDomainCallback (node.js:459:13) 

感謝を。情報がない場合はお知らせください。

+0

'npm install'を正しく実行しましたか?あなたのように見えます。 Macにインストールしたバージョンを確認し、そのバージョンに正確にマッチするように 'package.json'エントリを変更してください。 – david

+0

はい。それが役に立ちそうなら、package.jsonファイルを投稿できますか?私はnanoコマンドで/node_modules/google-spreadsheet/index.jsで使用するはずの機能を見ることはできますが、 – Thyregod

+0

google-spreadsheetモジュールのバージョンと、package.jsonにリストされているバージョンが一致しています。 – Thyregod

答えて

0

ありがとうございます!私はついにこの問題を解決しました。これはコードではなく、サーバーの設定です。より具体的に問題に関連付けるため、質問を更新しました。

0

あなたの認証資格情報が不足しているか、間違っているようです。 useServiceAccountAuthコールバックの可能なエラーにも対処する必要があります。

var filePath = filePrefix+"/some/filePath.json"; // <- correct credentials? 
doc.useServiceAccountAuth(creds, function (err) { 
    if(err) // handle error, you should see whats wrong 
}); 
+0

私はそれが正しい方向に私を助けたと思う。新しい例外がログに記録されました。これは権限であるように見えますが、これが問題です。 – Thyregod

関連する問題