CData Software Blog

クラウド連携のCData Software の技術ブログです。

Amazon Marketplace SP-API OAuth 2.0 Authorization Code Grant で Access Token を取得する

f:id:sugimomoto:20210512100032p:plain

こんにちは。CData Software Japanリードエンジニアの杉本です。

前回Postman を使って、Refresh Token で Access Tokenを取得する方法を紹介しました。

www.cdatablog.jp

ただ、内部で使うアプリは別として、実際にアプリとして公開した場合には、リソースにあくせすしたいユーザーのアクセス許可、つまり認可のプロセスを得てAccess Tokenを取得する必要があります。

そこで今回は Authorization Code Grantを使ってAccess Tokenを取得する方法を紹介します。

Amazon Marketplace SP-API の認可プロセスについて

その前に少しAmazon Marketplace SP-APIの認可プロセスについて確認しておきましょう。

Refresh Token による Grantを除くと、Amazon Marketplace SP-APIでは2種類の認可プロセスが提供されています。

github.com

リファレンスに書かている言葉を用いると

の2種類です。

この2つの違いは認可プロセスの開始場所です。

通常の OAuth 2.0 Authorization Code Grant は主に後者を指し、API連携アプリ・サービスを提供しているウェブサイトやソフトウェアからAmazon Marketplaceにリダイレクト、認証・認可のプロセスを経て、Authorization Codeを取得、そのCodeをAccess Tokenと交換します。

それに対して、前者の「マーケットプレイスアプリストアのワークフロー」は、以下のAmazon Sellar Centralからアクセスできるマーケットプレイスアプリストアが起点になります。

ここから利用したいアプリを選択し、認可ボタンをクリックすることで、API連携アプリがAuthorization Codeを受け取り、そのCodeをAccess Tokenと交換します。

f:id:sugimomoto:20210512095827p:plain

今回はベーシックな手法である、後者の「ウェブサイトワークフロー」の方法を紹介します。

ちなみに今回は連携用のWebアプリやRedirectを受け取るアプリなどは用意せず、手動でCodeを採取して、PostmanでAccess Tokenを取得します。

Postman では OAuth 2.0 を自動的に実施するための機能が備わっていますが、残念ながらAmazon Marketplace SP-APIの仕様が若干ズレているため利用できません。

実際にはリダイレクト先を待ち受けるアプリを作成して、しっかりとAuthorization Code Grant のプロセスを踏むようにしてください。

OAuthリダイレクトURIの指定

まず Amazon Marketplace Seller Central で作成したアプリにOAuth ログインURIとOAuth リダイレクトURIを指定しましょう。

通常は実際にOAuthを行うWebSiteと待ち受けるリダイレクト先URIを指定しますが、今回は手動で採取するので、適当です。実際には正しい情報を入力してください。

f:id:sugimomoto:20210512095835p:plain

認可の開始:Authorization URIの作成と表示

続いて認可URIを作成しましょう。認可URIは以下のような形式になります。

https://sellercentral.amazon.co.jp/apps/authorize/consent?application_id=XXXXX&version=beta&state=XXXXX

application_idには登録したクライアントアプリのアプリIDを指定します。

f:id:sugimomoto:20210512095843p:plain

「version=beta」は下書き状態のアプリクライアントを利用する場合は必須ですので注意しましょう。

ここで生成したURLをブラウザに貼り付けることで、認可画面が表示されます。通常はAPI連携アプリが生成して表示するページですね。

アクセス許可一覧に出てくるものは、対象のアプリクライアントで定めているロールによって異なります。

f:id:sugimomoto:20210512095848p:plain

「Confirm」をクリックすることで、登録しておいたRedirect URIに「spapi_oauth_code」「state」「selling_partner_id」がクエリパラメータとして返却されます。

実際にはアプリ側でこのリダレイクとを待ち受けて、これらのクエリパラメータを採取します。今回はそのまま「spapi_oauth_code」をコピペして次の手順へ進みます。

https://localhost.sugimomoto.com/?spapi_oauth_code=SRpQZlcrOaiAnRQIoWnC&state=12345&selling_partner_id=A1WD8M4EQL9XVH

f:id:sugimomoto:20210512095855p:plain

Postman を使って Authorization Code を Access Token に交換

「spapi_oauth_code」のAuthorization Codeを取得したら、この情報を使ってAccess Tokenを取得しましょう。

Access Tokenの取得には「https://api.amazon.com/auth/o2/token」に対してPOSTリクエストを実施して取得します。

パラメータは「application/x-www-form-urlencoded」で

プロパティ名 備考
grant_type authorization_code
code 例)SRpQZlcrOaiAnRQIoWnC 取得した「spapi_oauth_code」を指定します。
client_id 例)amzn1.application-oa2-client.9f309f65ff0042288221a4027f1bf2da LWA認証情報のクライアントIDを指定します。
client_secret 例)ce69326f0bd0a5283dd171ed7d995a80da42d727c862a3d6d5a573ac6a31ace5 LWA認証情報のクライアント機密情報を指定します。
POST /auth/o2/token HTTP/1.1
Host: api.amazon.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 266

grant_type=authorization_code&code=SRpQZlcrOaiAnRQIoWnC&client_id=amzn1.application-oa2-client.9f309f65ff0042288221a4027f1bf2da&client_secret=ce69326f0bd0a5283dd171ed7d995a80da42d727c862a3d6d5a573ac6a31ace5

「client_id」と「client_secret」は以下の画面で取得できる情報ですね。

f:id:sugimomoto:20210512095901p:plain

f:id:sugimomoto:20210512095907p:plain

これで以下のようにAccess Tokenが取得できます。

{
    "access_token": "Atza|IwEBICJJUpP9ThgKN9XiT8dgOXcLHTJ3Z5CcsTpE0ocCAqbx9RKAzzFeNxp1JjLQTRW1BRISoWCAg5X8BVd1zV0C-g8iCoy9fMSbXlwxvfnTgT0B-0h6bCP9w-iRZgpFT9x5p0y4TGsqheiVG3ofyhPQwjZjKOu8BBGe0lLPIFH_gn4FxaEGPKjnm8Sy2CWz_0wMYNIIlYx2lFPKdzID3yb0Q6h-InsNDpc1VlWRKI8a9E0QTkqzC7J4g012TlXdelXoNSu5r0a4HQiKbSdPoE_6j65yerK3_NQ8Tp6QQ",
    "refresh_token": "Atzr|IwEBILqJYTlofPdvLogDuoeNCm9msLBCofAkptyHR8Nz_EcomVvaB-nsBalhdUs7AQYJaau5g4_Ijejs0n7Da22MARKveG076iIoPgKHy4nd85ow-MLs-A_oUm77yW-8qK6DGEpKUqetbLfvKfz1sy20ryWhhI9icSksXt48ZW6AWy2UORkOR6g_EC5SxmQheSKMZ-7mtO-sS4_SwTVVhXx71_gUWdseAijdGSzYGLFXgxyhFIRip8xATzVpZ1nfo5uWLb12TZtgFNlEBk",
    "token_type": "bearer",
    "expires_in": 3600
}

あとは以下の記事のようにこのAccess Tokenを使ってAPIアクセスができます。

www.cdatablog.jp

おわりに

OAuth 2.0 は「マーケットプレイスアプリストアのワークフロー」「ウェブサイトワークフロー」の違いさえちゃんと把握しておけば、そんなに難しいところは無いかなと思います。

認可URIの生成だけ、ベーシックなOAuth 2.0 とは異なるので注意しましょう。

www.cdata.com

f:id:sugimomoto:20210511140113p:plain