人間、成長を実感し始めていろいろなことがわかるようになったころが一番危ないですよね。
そんな初心忘るるべからずの精神を胸に刻まんと、戒めとして記します。
ことの始まり
ある日突然ebayのAPIで使用するアクセストークンを取得している部分で認証エラーが出始めた。
この辺のエラーは何度も経験してきているので、「あぁ、リフレッシュトークンの期限が切れたのか。。」とすぐさま察知。
通常のプロジェクトだとappID(Client ID)とru-name(リダイレクトuri)を含んだリンクを「ebay連携」のようなボタンで設置し、以下のフローでリフレッシュトークンを取得するケースが多い。
- ボタン押下
- ebayログイン画面に遷移&ログイン実行
- アプリケーションを許可
- アプリにリダイレクト
- リダイレクトされてきたコントローラ内で、付与されたcodeパラメータを使用してAPIリクエストを行いリフレッシュトークンを取得
ただこのプロジェクトは上記フローのようにアプリにリダイレクトさせて自動でリフレッシュトークンを取得するのではなく、codeをURLから直接取得し、postmanを使用して手動でリフレッシュトークンを取得してDBに保存しているようだった。
※postmanについてはこちらで簡単に紹介しています。
長い戦い
手順はわかったので1-3のフローを終えURLからcodeを取得し、postmanでリクエストしたところ、以下のエラーが返却される。
{
"error": "invalid_grant",
"error_description": "the provided authorization grant code is invalid or was issued to another client"
}
直訳すると
「提供された認可付与コードが無効であるか、別のクライアントに発行されたものです」
となるが、この辺のエラーメッセージは当てにならないケースが往々にしてあるので、検証を開始してみる。
検証したこと
※以下いずれの方法もpostmanでの手動リクエストで検証
① リクエスト内容に問題はないか
一番最初にすること。ebayのリフレッシュトークン取得のリクエストに必要なのはappID, CertID, redirect_uriとなるが、いずれも正しいものであった。
② 該当アプリに対して別のストアで連携してみる
同様のエラー("invalid_grant"以下同)が発生する
③ 別のアプリで連携してみる
自社の別のアプリで連携できるか検証。同様のエラーが発生する。
④ rails cでリフレッシュトークンを取得するサービスにcodeを渡して実行
同様のエラーが発生する。
⑤ 別アプリの自動連携(ボタン押したら連携してくれる)処理内でcodeを出力し、それをリクエスト
リフレッシュトークン取得成功
上記①-④いずれも解決には至らず、頭を悩ませていたところで「これpostmanのリクエスト方法がそもそも間違ってるんじゃないか...?」と疑い始めるが、⑤を実行したところ成功。
postmanのリクエストは合っていると認識。
成功したリクエストと失敗したリクエストと睨めっこしたところ「失敗してるやつのcode、%が多いな...((゚Д゚)))ハッ」
デコードしてない
これデコードしてないやんけ!!
デコードしてリクエストしたら無事成功。
反省
エラーメッセージの通りcodeに問題があったので、やはりまずはそこをちゃんと検証すべきだった。
ちなみにAmazonAdsAPIのOAuth連携で付与されるcodeはエンコードされていないのでそのまま使える。
ebayの時はデコードを忘れずに。戒め。