Google Sheets API を使ってOAuth 2.0 クライアント IDで認証の時401エラー(UNAUTHENTICATED)が出ました。
解決したいこと
Node.jsにおいて下記のGoogle Sheets APIを使用し、公開しているGoogleSheetのあるシートを別のシートにコピーしようとしましたが、エラーレスポンスが返ってきてコピーできない状態です。これを解決しようとしています。
https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.sheets/copyTo
発生している問題・エラー
npmモジュールである"sync-fetch"と"googleapis"モジュールを使用し、Googleに対しPOSTリクエストを行いましたが、そのレスポンスが"UNAUTHENTICATED"で返ってきてしまいます。
{
error: {
code: 401,
message: 'Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.',
status: 'UNAUTHENTICATED'
}
}
構成図
├── node_modules
├── package.json
├── index.js
└── app
└── googleSheetApi.js
該当するソースコード
index.js
const spreadSheets = require('./app/googleSheetApi.js')
const credentials = 'credentialsファイルのフルパス';
const token = 'tokenファイルのフルパス';
const sheetId = 2014670255;
spreadSheets.syncfetch(credentials, token);
googleSheetApi.js
const { google } = require('googleapis');
const fs = require('fs');
const syncfetch = require('sync-fetch')
//googleのOAuth 2.0 クライアント IDで認証
function authorize(credentialPath, tokenPath) {
//事前に用意したcredential、tokenのファイルを読み込み
const credentials = JSON.parse(fs.readFileSync(credentialPath));
const token = JSON.parse(fs.readFileSync(tokenPath));
const { client_secret, client_id, redirect_uris } = credentials.installed;
const oAuth2Client = new google.auth.OAuth2(client_id, client_secret, redirect_uris[0]);
oAuth2Client.setCredentials(token)
return oAuth2Client;
}
const apis = {
syncfetch: (credentialPath, tokenPath) => {
const req = {
"requests": [
{
"destinationSpreadsheetId": 'destinationSpreadsheetId'
}
]
}
const authClient = authorize(credentialPath, tokenPath);
const response = syncfetch('https://sheets.googleapis.com/v4/spreadsheets/{spreadsheetId}/sheets/{range}:copyTo', {
method: 'POST',
headers: {
//間違っているのはこちらの認証ステップだと思います。
//認証の情報はどうやって送るか分からないです。
'Authorization': authClient,
'Content-Type': 'application/json'
},
body: JSON.stringify(req)
})
const json = response.json()
console.log(json)
return JSON.stringify(json.responses)
}
}
module.exports = apis;
自分で試したこと
https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.sheets/copyTo
Googleのサイト上のNode.jsのサンプルコードを参考にして、非同期処理ではシートのコピーは成功しましたが、今回の同期処理のPOSTリクエストではコピーに失敗している状態です。
0