‘invalid_client’なぜ認証エラー?実はAmazon SP-APIの認証がめっちゃ簡単になってた【Node.js】

Amazon SP-APIとFirebase Functions Firebase

先日Firebase Functionsで運用中のSP-APIを利用したアプリで、突然下のようなClient authentication falied エラーが出るようになってしまいました。

Amazonでの販売データを定期的に取得するスケジュールファンクションだったのですが、いきなり認証エラーで止まってしまい驚きました。

初めは認証情報が間違っていたり、古くなっているのかと思い、IDやシークレットの再設定などを試しましたが、いっこうにエラーがおさまらないので本腰をいれて対応することになり、無事エラーを解消できた方法をお伝えします。

amazon-sp-api (client for the Amazon Selling Partner API)の更新

まずスケジュールファンクションで使用しているnpmライブラリをアップデートします。

既存プログラムのものをアップデートする方法でもいいのかもしれませんが、v2としてあらたなリポジトリとして始める方が余計な手間が省けると思います。

amazon-sp-api公式のドキュメントはこちらから確認できます。

amazon-sp-api
Amazon Selling Partner API client. Latest version: 1.1.1, last published: 14 days ago. Start using amazon-sp-api in your...

もしバージョンを指定してnpmアップデートをする際は、バージョン1.x.x以上のものを使用してください。

amazon-sp-api 1.x.x以降の認証方法変更点

上にあげたドキュメントの中で、認証方法に関する変更点を探してみると、

このような記述があるので、リンクを辿って内容を確認してみます。

重大な変更と題して、3項目の情報が見つかりました。

その中で認証(Credentials)に関係していそうなものをGoogle翻訳すると、

いちおう変更に関する情報の裏どりとして、Amazon SP-APIの公式ドキュメントにもあたってみると、下のような情報があがっていました。

SP-API no longer requires AWS IAM or AWS Signature Version 4
Starting October 2, 2023 , SP-API no longer requires the use of AWS Identity and Access Management (IAM) or AWS Signatur...

さらに詳しく調べたい方は、上のページの「アマゾンでログイン」などのリンクから詳細を確認してみてください。

具体的な変更点

それでは具体的な変更点に移ります。

let sellingPartner = new SellingPartnerAPI({
        region:'fe', // The region to use for the SP-API endpoints ("eu", "na" or "fe")
        //REFRESH_TOKEN
        refresh_token:refresh_token,
        credentials:{
            SELLING_PARTNER_APP_CLIENT_ID:sellingPartnerAppClinetId,
            SELLING_PARTNER_APP_CLIENT_SECRET:sellingPartnerAppClientSecret,
            AWS_ACCESS_KEY_ID:awsAccessKeyId,
            AWS_SECRET_ACCESS_KEY:awsSecretAccessKey,
            AWS_SELLING_PARTNER_ROLE:awsSellingPartnerRole
        }
        });

これまでの認証には上にあるように、REFRESH_TOKEN、SELLING_PARTNER_APP_CLIENT_ID、SELLING_PARTNER_APP_CLIENT_SECRET、AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_SELLING_PARTNER_ROLEの6種類の情報が必要でした。

さらにAWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_SELLING_PARTNER_ROLEの3つに関しては、AWS Identity and Access Management (IAM)でユーザーを作成し、Roleを付与して認証情報を取得する必要があったりなど、初心者にはハードルの高い煩雑さがありました。

で、これからどのように変更されるかというと、

Amazonセラーセントラルのアプリの開発で作成する、LWA認証情報とリフレッシュトークンの3種類の認証情報だけでクライアント認証ができます。

amazon-sp-apiのドキュメントに従い、

// commonjs
const SellingPartner = require("amazon-sp-api");

ライブラリーを読み込み、認証処理を行います。

const spClient = new SellingPartner({
            region: "fe",
            refresh_token: refresh_token,
            credentials:{
                SELLING_PARTNER_APP_CLIENT_ID: sellingPartnerAppClinetId,
                SELLING_PARTNER_APP_CLIENT_SECRET: sellingPartnerAppClientSecret
            }
        });

※公式では~/.amzspapi/credentialsとして認証情報管理ファイルを作成する方法が推奨されていますが、Firebase Functionsでの運用を前提としているので、.envファイルで環境変数として登録をしています。

ちなみにSP-APIのリクエストエンドポイントには変更がないようなので、ライブラリの更新と認証情報以外はそのまま活用できました。

以上になります。

お伝えした情報が役に立ったときや、ご質問などはお気軽にコメントから投稿してください。コードの間違いや、より良い運用方法についてもお待ちしております。

コメント

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