はじまり
なんか認証できなくなったぁぁ・・・
うわあ、何だろこれマジで・・・
1週間前からコード変えてないよ!?
わけわかんねえな・・・
何が起こっているのか
今回は、Google Apps Script(GAS)で、Googleドライブにある画像をGoogle Cloud Storage(GCS)にアップロードするために、GCSを認証する時のお話です。
まあ、Google Cloud Platform(GCP)で「APIとサービス」→「認証情報」→「OAuth 2.0 クライアント ID」の流れで、クライアントIDとクライアントシークレットを作っていつも通り認証します・・・
すると・・・
おお、何だこれは
まあ、数分後にリフレッシュすればいいんだな
そんな調子でリフレッシュしてみますが・・・
あれっ、同じ画面だ
どこのNPCかな?
原因を調査する
結局、何分後に読み込み直しても、何時間後に読み込み直しても、依然として同じ画面が出続けます。
IDとシークレットを入れているscriptPropertiesのキーとかも問題ないし、「OAuth2」のライブラリがおかしいってことも無さそう。
(OAuth2のライブラリは、ライブラリID「1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF」のやつですね。)
僕が認証機能を作ったのが1週間前で、僕がOAuth2のリポジトリを見た時の更新日時が2ヶ月前でした。なので、OAuth2は問題じゃない。
この「Google ドキュメント内でエラーが発生しました。このページを再読み込みするか、数分後にこのページをもう一度開いてみてください。」の文章で調べると、だいたいブラウザの閲覧履歴を消すという対策が出てきましたが、その方法でも解消しませんでした。
Googleから、色々とトラブルシューティングの候補が挙げられています。(でもこれも関係無さそう・・・期間内に新しい拡張機能入れてないんだよな)
他には、PDFに変換する領域内に環境依存文字があることで同じエラー画面が出てくるらしいのです。なので、スプシの内容かと思いましたが、それは関係ありませんでした。(後述しますが)
なぜか認証機能が動いた
そして、何をしたら動いたかと言うと・・・
ブックとシートを作り直して、そのGASに丸々同じものを書き写したら、動きました!!
この画面は、OAuthからのリダイレクト時に、こんなスクリプトで表示する手筈になっているものです。
/**
* @description 認証コールバック
* @return {null}
*/
function authCallback(request) {
let service = getStorageService(false);
let isAuthorized = service.handleCallback(request);
let statement = ``;
if (isAuthorized) {
console.log("Authorized!");
console.log(`authCallback: 111111111111111111111111111111111111111111111`);
statement = `<center>認証完了<br>タブを閉じてください。</center>`;
} else {
console.log("Not Authorized...");
console.log(`authCallback: 222222222222222222222222222222222222222222222`);
statement = `認証エラー<br>認証情報をお確かめください。`;
}
return HtmlService.createHtmlOutput(statement);
}
/**
* @description 認証用サービス取得
* @param {boolean} isInputting
* @return {}
*/
function getStorageService(isInputting) {
const keyClientId = KEY_CLIENT_ID_SCRIPT_PROPERTY;
const keyClientSecret = KEY_CLIENT_SECRET_SCRIPT_PROPERTY;
let cfg = getClientConfig(isInputting, keyClientId, keyClientSecret);
console.log(cfg);
console.log(`getStorageService: 111111111111111111111111111111111111111111111`);
if(cfg.clientId == null || cfg.clientSecret == null){
EXE_TYPE = "authentication";
const html = getHtmlOutput("index_html", "Authentication failed.")
SpreadsheetApp.getUi().showModelessDialog(html, "Authentication failed.", "<p>Because of the shotage of OAuth2.0 Client Information.</p>");
return null;
}
console.log(`getStorageService: 22222222222222222222222222222222222222222222`);
return OAuth2.createService("provisioning")
.setAuthorizationBaseUrl("https://accounts.google.com/o/oauth2/auth")
.setTokenUrl("https://accounts.google.com/o/oauth2/token")
.setClientId(cfg.clientId)
.setClientSecret(cfg.clientSecret)
.setCallbackFunction("authCallback")
.setPropertyStore(PropertiesService.getScriptProperties())
.setScope("https://www.googleapis.com/auth/devstorage.full_control")
.setParam("login_hint", Session.getActiveUser().getEmail())
}
ふーむ、意味が分からない・・・
ちなみに、認証機能ではシートは全く参照しないというのと、シートの内容も作り直す前のシートと同じ内容にしました。
なので、スプシの内容は僕の場合は関係無さそうでした。
思い当たる節は・・・
そういえば、その1週間の間に、この認証機能があるブックの中にあるシートの内、AppSheetのデータベースとして連携させたものがあったなあ・・・
新しいブックでは、まだAppSheetに連携させているデータベースはない・・・
じゃあ、AppSheetに連携させればまた動かなくなるのかも?(AppSheetっていうのは、ノーコードでアプリが作れるサービスのことです)
まあ、こんな感じで新しいブックをAppSheetのDBとして連携させます。
そして、認証させてみると・・・アレ?
認証通っちゃったなあ・・・
結局、原因は分かりませんでした。
まとめ
今回のまとめです。
今回、チェックした事柄
今回チェックした事柄です。同じような事象が発生した時のチェック表としてご活用下さい。
- 5分以上待ってからもう一度読み込む
- シートの内容(環境依存文字が入ってたりしないか)
- scriptPropertiesのキー
- OAuth2ライブラリの挙動
- ブラウザ(今回はChrome)の閲覧履歴の全消去
- 別のブラウザを試す(普段使わないEdgeで試したりもしました)
- その他ここに載っていること
- AppSheetとの連携
今後、気を付けたいこと
自分の今後の心掛けたいこととして、
- GASの不具合でどうしても分からないときはブックを作り直す・・・1時間詰まったら作り直そう。
- Gitは怠けずにブランチを切る・・・個人用途で作っているものなので、ほとんどmainブランチにpushしてしまっていました。なので、ブックを作り直す時にすぐにコードを再現させるために、新機能を作るたびにブランチを切るようにします。
- スクリプトは定期的に動かすようにする・・・今回の事象が発生し始めた日時が分からず、原因が突き止めきれませんでした。なので、普段からコードを動かして原因のスコープを狭めて、即座にデバッグできるようにします。
- OAuthなどの認証機能があるブックは機能を肥大化させない・・・作り直しの時に大変になるので。
おしまい
腑に落ちない!
とりあえず動いて良かったがな・・・
以上になります!
コメント