access tokenの更新失敗

9 個の投稿 / 0 new
最終投稿
#1 2019/6/6 (木) 12:29
atsushi0843

access tokenの更新失敗

既存の質問への追加として
https://developer.next-engine.com/questions/578#comment-1787
に書き込んだのですが、埋もれてしまっているかも知れませんので、新規の質問として改めて書き込みますことをご了承ください。

バッチでAPIを実行する際、
「access tokenが有効期限切れ、refresh tokenが期限内という状態になった場合、初回のAPI実行のみエラーにはならず新しいaccess tokenとrefresh tokenが発行されます」
とのことですが、
上記条件に該当する初回API実行時にも、たまにエラー(002002: access_token[xxxxx]が不正です。)が発生することがあります。
その場合、バッチでは二度と新しいaccess_tokenはもらえないので、アプリにアクセスしてaccess_tokenをもらうしかありません。

一時間おきにバッチ実行した場合も、一日に一回実行した場合も、数日から二週間に一回くらいのペースでエラーになりました。

何かやり方に問題があるか確認すべき点があればご助言願えませんでしょうか。
何卒よろしくお願い申し上げます。

2019/6/6 (木) 19:06

access tokenの更新失敗

下記の点のご確認をお願いいたします。

-新しく発行されたaccess_token & refresh_tokenがアプリ側で正しく保持されているか
-バッチ処理が並列で行われていないか
※並列にて処理されている場合、access_tokenの更新が走った際に後続のバッチにてエラーが発生します。

2019/6/6 (木) 20:57 ( #2への返信)
atsushi0843

早速のご返信ありがとうございます。

早速のご返信ありがとうございます。

-新しく発行されたaccess_token & refresh_tokenがアプリ側で正しく保持されているか

⇒保持したaccess_token&refresh_tokenで通常は正しくAPIにアクセスできており、access_tokenが切れた際も、通常は新しいaccess_tokenをもらえています。
 エラーが発生する際も、同じaccess_token&refresh_tokenで一回前にはアクセスに成功しています。

-バッチ処理が並列で行われていないか
※並列にて処理されている場合、access_tokenの更新が走った際に後続のバッチにてエラーが発生します。

⇒一台のサーバで一日おきにcronで実行しているだけであり、並列処理はされていないはずです。

一日おき(以前は一時間おき)に実行しており、ちょうどaccess_tokenが切れる瞬間にアクセスすることになるのですが、それは良く無かったりしますでしょうか。

2019/6/7 (金) 16:26

>一日おき(以前は一時間おき)に実行しており

>一日おき(以前は一時間おき)に実行しており、ちょうどaccess_tokenが切れる瞬間にアクセスすることになるのですが、それは良く無かったりしますでしょうか。
トークンが更新されるタイミングであったとしても、新しく発行されたアクセストークンおよびリフレッシュトークンを確実に保持していれば、まったく問題はございません。

記載されている内容からは、問題となるような仕様は特に見つかりません。
恐れ入りますが、ソースコードに不備がないか再度ご確認いただけますでしょうか。

2019/6/10 (月) 11:29
atsushi0843

ソースを確認いたしましたが

ソースを確認いたしましたが、今のところ特に不備は見つけられませんでした。

例えば時系列で書きますと、

・2019-06-02 00:00:01
  古いaccess_tokenは2019-06-01 00:00:02で切れており、
  access_token[A](期限2019-06-03 00:00:01)
  refresh_token[B](期限2019-06-05 00:00:01)を取得

・2019-06-03 00:00:01
  access_token[A](期限2019-06-03 00:00:01)
  refresh_token[B](期限2019-06-05 00:00:01)で認証

・2019-06-04 00:00:01
  access_token[A]は切れているがrefresh_token[B]は有効のはずだが、
  エラーコード002002[access_token[A]が不正です。]が発生
  
となることがあります。
refresh_tokenが間違っているとこうなるのかもと思いますが、
通常は同じパターンで新しいaccess_tokenが発行されているので、
refresh_tokenも正しく渡せているはずなのですが・・・

クローズドでID等お伝えすれば、ログから原因等調査してもらうことは可能でしょうか。

2019/6/11 (火) 09:33
wingbell

同じ症状で困っております

相乗り失礼いたします。

私も全く同様の症状で困っており、投稿しようとしたところこのスレッドを見つけました。
Google Apps Scriptで1日1回APIにアクセスしてアクセストークンとリフレッシュトークンを受け取り、
その値を保持して翌日のアクセスに保持した値を使用しているのですが
atsushi0843様の昨日の投稿と同様の事象が起きております。

まだn=2ではありますが、調査いただければ幸いです。
何卒よろしくお願い致します。

2019/6/11 (火) 15:50

調査依頼につきまして

atsushi0843様 wingbell様
承知いたしました。こちら調査させていただきますので、お手数ですが下記の情報を非公開投稿にて、頂戴できますでしょうか。
-7桁の企業ID
-トークン情報を含むエラー発生時のリクエストおよびレスポンス

何卒よろしくお願いいたします。

2019/6/18 (火) 12:03
atsushi0843

調査結果報告

非公開投稿にてご対応いただき(恐らく)解決いたしましたので、情報共有させていただきます。

一回のスクリプト実行で「/api_v1_receiveorder_base/search」で対象伝票を検索した後
「 /api_v1_receiveorder_base/search」で伝票詳細を取得していましたが、
トークンの更新を「/api_v1_receiveorder_base/search」でしか行っていなかったのが原因でした。

アクセストークンの期限切れギリギリのタイミングでのアクセスでしたので、
ほぼ同時に二回APIを叩いて一回目は有効期限内、二回目は有効期限切れで新しいトークンが発行されるケースが稀にありましたが、
一回目しかトークン更新の処理を入れていなかったため、二回目の新しいトークンを取りこぼしていたということです。

初歩的なミスでお恥ずかしい限りですが、情報共有まで。。。

2019/6/18 (火) 12:23
wingbell

結果報告

>atsushi0843様

officialに調査いただきこちらは解決しましたので、
同じケースかわかりませんが他の方も参照できるようこちらに記載させていただきます。

投稿を引用させていただき説明します。
////////////////////////////////////////////////////////
・2019-06-02 00:00:01
  古いaccess_tokenは2019-06-01 00:00:02で切れており、
  access_token[A](期限2019-06-03 00:00:01)
  refresh_token[B](期限2019-06-05 00:00:01)を取得

・2019-06-03 00:00:01
  access_token[A](期限2019-06-03 00:00:01)
  refresh_token[B](期限2019-06-05 00:00:01)で認証

・2019-06-04 00:00:01
  access_token[A]は切れているがrefresh_token[B]は有効のはずだが、
  エラーコード002002[access_token[A]が不正です。]が発生
////////////////////////////////////////////////////////

6/3の認証が有効期限と全く同時刻な点はこちらでは未検証ですが
仮にaccess_tokenの期限は切れていたとします。
このとき、access_token、refresh_tokenが共に更新されます。
私も勘違いしていたのですが、refresh_tokenも更新されて値も有効期限も変わっています。
よって、以前のrefresh_tokenが有効期限内だったとしても
6/4にアクセスした際にはエラーになります。

仮に6/3の認証時にはaccess_tokenは有効期限内だった場合で、
6/4にエラーになるということであれば
6/3の認証から6/4までの間にAPIにアクセスするプログラムはなかったでしょうか。
一度でもアクセスがあればaccess_tokenは期限切れのためtokenの更新が走ってしまい
上記と同じ理由で6/4にアクセスした際にエラーになります。

APIにアクセスするすべてのプログラムで毎回tokenの戻り値を取得するようにして
どこか1箇所に常に最新の値を保持しておき、その値を使用することで回避できるかと思います。

[追記]
コメントされているのに気づかず投稿してしまいました。
やはりお互い原因は同じだったようですね。
初回投稿いただいたおかげでこちらも解決につながりました。
ありがとうございました。