質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

OAuth 2.0

OAuth 2.0(Open Authorization 2.0)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

受付中

複製したGASで、AmazonSPAPIの認可フローを完了する

thimone
thimone

総合スコア1

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

OAuth 2.0

OAuth 2.0(Open Authorization 2.0)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

1回答

0評価

1クリップ

550閲覧

投稿2022/04/29 07:31

編集2022/05/04 05:13

前提

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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

qnoir

2022/04/29 09:35

・AUTH_ENDPOINT、TOKEN_ENDPOINT、CLIENT_ID、CLIENT_SECRET、APP_ID はソースコードに直書きされている、という理解でよろしいでしょうか。 ・コピー元ファイルとコピー先ファイルで、CLIENT_ID、CLIENT_SECRET等は同一の値のままで運用する、という理解でよろしいでしょうか?
thimone

2022/04/29 13:13

>・AUTH_ENDPOINT、TOKEN_ENDPOINT、CLIENT_ID、CLIENT_SECRET、APP_ID はソースコードに直書きされている、という理解でよろしいでしょうか。  →はい、コードに直書きされています。 >・コピー元ファイルとコピー先ファイルで、CLIENT_ID、CLIENT_SECRET等は同一の値のままで運用する、という理解でよろしいでしょうか?  →はい、同一の値のまま運用します。 よろしくお願いいたします。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

OAuth 2.0

OAuth 2.0(Open Authorization 2.0)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。