前提
GASでAmazonSP-APIと連携している、スプレッドシートがあります。
これを、スプレッドシートをコピーしてそのまま配布しても同様に動作するようにしたいです。
しかし、SPAPIの認証方法(利用者セラーからアプリケーションへの認可)で詰まっている状態で、
認証ワークフローからすると、下記2点により難しいのではないかと考えています。
①複製後のスプレッドシートは最初Webアプリとしてデプロイされていないため、認証完了後のリダイレクトを受けられない
②リダイレクトURIが用意できたとしても、それをセラーセントラルのアプリケーション登録画面から設定しなければならない
→①は手順追加で対応できますが、②は運用上現実的ではない状態です
実現したいこと
コピー後も認証フローを完了させられるようなスプレッドシートにしたいので、
そのための仕組みづくりが可能であれば教えていただきたいです。
(セラーセントラルのアプリ登録でリダイレクトURIはこれにする、リダイレクト用アプリを用意する、設定するstateパラメータはこれにする等)
コピー後スプレッドシートに対しての個別設定は、Webアプリデプロイの操作のみ許容できます。
発生している問題・エラーメッセージ
単純にスプレッドシートをコピーしたもので認証しようとすると、
「SP-APIを承認」画面のConfirm後に下記メッセージが表示されます。
問題が発生しました 無効なリダイレクトURLを受信しました。使用されたリダイレクトURLを確認してください。 Amazonテクニカルサポートに連絡して、以下の情報をお知らせください。 App ID: amzn1.sp.solution.XXX Error Code: MD5101
該当のソースコード
javascript
AUTH_ENDPOINT = 'https://XXX'; TOKEN_ENDPOINT = 'https://YYY'; CLIENT_ID = 'AAA'; CLIENT_SECRET = 'BBB'; APP_ID = 'CCC'; // OAuth2ライブラリ使用 function getService() { // OAuth 2.0承認サービスの生成 return OAuth2.createService('spapi') .setAuthorizationBaseUrl(AUTH_ENDPOINT) // 認可エンドポイント .setTokenUrl(TOKEN_ENDPOINT) // トークンエンドポイント .setClientId(CLIENT_ID) // OAuthクライアントID .setClientSecret(CLIENT_SECRET) // OAuthクライアントシークレット .setParam('application_id', APP_ID) .setParam('version', 'beta') // OAuth2.0 承認後のコールバック関数名の設定 .setCallbackFunction('authCallback') // 承認トークンを維持するプロパティーストアの設定 .setPropertyStore(PropertiesService.getUserProperties()) } /** * 最初のOAuth2承認の際のコールバック処理 */ function authCallback(request) { var service = getService(); // トークン取得用にパラメータを追加 request.parameter['code'] = request.parameter.spapi_oauth_code; var authorized = service.handleCallback(request); if (authorized) { service.getAccessToken(); return HtmlService.createHtmlOutput(`認証に成功しました。`); } return HtmlService.createHtmlOutput('認証に失敗しました。処理をやり直してください。'); } /** * 認証用ダイアログ(html)表示 * セラーセントラルの認証URLへリンクさせる */ function showDialog(){ const service = getService(); const url = service.getAuthorizationUrl(); const tag_text = `<button type="button" class="btn btn-primary" onclick="window.open('${url}')">セラーセントラルで認証する</button>`; const html = HtmlService.createHtmlOutput(tag_text); SpreadsheetApp.getUi().showModalDialog(html, "認証ダイアログ"); }
//セラーセントラルのアプリ登録画面「OAuthリダイレクトURI」 https://script.google.com/macros/d/{コピー元スプレッドシートのスクリプトID}/usercallback
まだ回答がついていません
会員登録して回答してみよう