GASでエラー 400: redirect_uri_mismatchが出るとき

GAS

Google App ScriptでGoogleDriveと接続してアプリを開発したい。

そう思って、プロトタイプというか、骨子をChatGPTに作らせたのです。

使ったGoogleDriveのモジュールはDriveApp。

GoogleCloudのAPI認証設定もして、APIキーとOAuth 2.0 クライアント IDも作りました。テストコード書いて(後述)実行したら、以下のエラーが出ました。

エラー 400: redirect_uri_mismatch

このアプリは Google の OAuth 2.0 ポリシーを遵守していないため、ログインできません。

このアプリのデベロッパーの方は、Google Cloud コンソールで JavaScript オリジンを登録してください。
リクエストの詳細: origin=https://n-ran6u6zgj5zvijvckcfydy4r24vyaohw3xd2q2a-0lu-script.googleusercontent.com flowName=GeneralOAuthFlow

一見クライアントIDの承認済みの JavaScript 生成元に上記のリクエストの詳細のURI入れれば良いじゃんと思うじゃないですか。

違います。この部分は無視してください。

もちろん、外部からGAS呼び出して処理しているのならそうかもしれませんが(未確認)、今回は単独でGASの実行をします。さて、何を入力したら良いか?

承認済みの JavaScript 生成元は「https://script.google.com」を

承認済みのリダイレクト URIは「https://script.google.com/macros/d/<スクリプトID>/usercallback

を入れます。

スクリプトIDはエディタでサイドバーの歯車アイコンをクリックして「プロジェクトの設定」を表示します。その中にスクリプトIDがあります。あ、アプリの種別はウェブアプリケーションです。

以上で、エラーの対応は終了。5分から数時間待ってください(謎

じゃあ、確認方法ですが、まず、スクリプトIDが表示されている下部にスクリプトプロパティという、シークレット記号を格納できる部分があります。そこに、CLIENT_IDと、CLIENT_SECRETを入れます。

CLIENT_IDと、CLIENT_SECRETはクライアントIDの画面に載ってます(見つからないときはブラウザ最大化してください)

コード.gs
// OAuth2 サービスを設定する関数
function getOAuthService() {
  return OAuth2.createService('GoogleDrive')
    .setAuthorizationBaseUrl('https://accounts.google.com/o/oauth2/auth')
    .setTokenUrl('https://accounts.google.com/o/oauth2/token')
    .setClientId(PropertiesService.getScriptProperties().getProperty('CLIENT_ID'))
    .setClientSecret(PropertiesService.getScriptProperties().getProperty('CLIENT_SECRET'))
    .setCallbackFunction('authCallback')
    .setPropertyStore(PropertiesService.getUserProperties())
    .setScope('https://www.googleapis.com/auth/drive')
    .setParam('access_type', 'offline')
    .setParam('prompt', 'consent');
}
// ウェブアプリケーションのエントリーポイント
function doGet(e) {
  var service = getOAuthService();
  if (!service.hasAccess()) {
    var authorizationUrl = service.getAuthorizationUrl();
    var template = HtmlService.createTemplate(
      '<a href="<?= authorizationUrl ?>" target="_blank">Authorize</a>. ' +
      'Reopen the sidebar when the authorization is complete.');
    template.authorizationUrl = authorizationUrl;
    return template.evaluate();
  } else {
    // 認証済みの場合、Google Driveの操作を行う
    return HtmlService.createHtmlOutput('認証済み。Google Driveにアクセスできます。');
  }
}

// OAuth コールバック関数
function authCallback(request) {
  var service = getOAuthService();
  var authorized = service.handleCallback(request);
  if (authorized) {
    return HtmlService.createHtmlOutput('認証成功!このページを閉じてください。');
  } else {
    return HtmlService.createHtmlOutput('認証に失敗しました。');
  }
}

// Google Driveの操作を行う関数の例
function listFiles() {
  var service = getOAuthService();
  if (service.hasAccess()) {
    var url = 'https://www.googleapis.com/drive/v3/files';
    var response = UrlFetchApp.fetch(url, {
      headers: {
        Authorization: 'Bearer ' + service.getAccessToken()
      }
    });
    var result = JSON.parse(response.getContentText());
    Logger.log(JSON.stringify(result, null, 2));
  } else {
    Logger.log('認証が必要です。');
  }
}

クライアントIDの画面にある、「appsscript.json」マニフェスト ファイルをエディタで表示する、のチェックボックスをオンへ。するとappsscript.jsonが編集できるようになります。

appsscript.json
{
  "timeZone": "Asia/Tokyo",
  "dependencies": {
    "enabledAdvancedServices": [
      {
        "userSymbol": "Drive",
        "serviceId": "drive",
        "version": "v2"
      }
    ],
    "libraries": [
      {
        "userSymbol": "OAuth2",
        "libraryId": "1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF",
        "version": "38"
      }
    ]
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "oauthScopes": [
    "https://www.googleapis.com/auth/script.external_request",
    "https://www.googleapis.com/auth/drive"
  ],
  "webapp": {
    "executeAs": "USER_DEPLOYING",
    "access": "MYSELF"
  }
}

この2つを保存し、デプロイして、リンク踏んで実行すると確認画面がでます。

いじょ。ChatGPTは役に立たず、perplexityという検索型AI使って解決しました。cradleは落ちてるし、Geminiは答えを返してくれないし、プロが答えるサイトに500円課金して聞いたけど返答が無かった。web検索しても情報が出てこなくて困りました。

後から調べたら、認証エラーはデプロイ方法(個人に限定してたのを広げた)や、スコープの設定が甘かったとか微妙な違いによるものと判明。GASに関する認証エラーであって、GoogleDriveのものではなかったらしい。

コメント

タイトルとURLをコピーしました