RORK LABEN
MAX — Rork MaxはSwiftのネイティブアプリを生成し、iPhone・iPad・Apple Watch・Apple TV・Vision Pro・iMessageに対応しますPUBLISH — Rork Maxは2クリックでApp Store公開まで進められます。料金は月$200ですRN — 標準のRorkはReact Native(Expo)でiOS/Androidのネイティブアプリを生成。素早く形にするならこちらですPRICE — Rorkは無料で開始でき、有料プランは月$25からですFUND — Rorkはa16zから280万ドルを調達。月間訪問は74.3万を超え、成長率は85%とされていますFLOW — 作りたいアプリを平易な言葉で説明すると、ストアに配信できる動くコードが生成され、カメラや通知など端末機能も使えますMAX — Rork MaxはSwiftのネイティブアプリを生成し、iPhone・iPad・Apple Watch・Apple TV・Vision Pro・iMessageに対応しますPUBLISH — Rork Maxは2クリックでApp Store公開まで進められます。料金は月$200ですRN — 標準のRorkはReact Native(Expo)でiOS/Androidのネイティブアプリを生成。素早く形にするならこちらですPRICE — Rorkは無料で開始でき、有料プランは月$25からですFUND — Rorkはa16zから280万ドルを調達。月間訪問は74.3万を超え、成長率は85%とされていますFLOW — 作りたいアプリを平易な言葉で説明すると、ストアに配信できる動くコードが生成され、カメラや通知など端末機能も使えます
記事一覧/開発ツール
開発ツール/2026-06-19上級

Rork アプリの API 通信を堅くする — トークン更新・再試行・冪等性の設計

Rork が生成する fetch はそのままだと、トークン切れ・電波の揺らぎ・二重送信に弱いままです。トークンの自動更新、再試行とバックオフ、冪等性キーを一つのクライアント層に集約する設計を、実装コードと運用の数値とともに整理しました。

Rork424React Native168API4認証10冪等性3

プレミアム記事

リリースしたばかりの Rork アプリで、たまに「ログインし直してください」と表示されるという報告をもらいました。再現は難しく、特定の操作で必ず出るわけでもありません。手元で粘って観察すると、しばらくアプリを放置した後の最初の操作で出やすいと分かってきました。

正体は、アクセストークンの期限切れでした。Rork が生成した fetch は、トークンを付けて送るところまでは書いてくれますが、期限が切れたときに静かに更新して送り直す、という面倒までは見てくれません。期限切れがそのまま「認証エラー」として画面に出ていたのです。

個人開発で課金や同期を伴うアプリを運用していると、通信の堅さはレビューの評価に直結します。ここでは、Rork が出した素の fetch を土台に、トークン更新・再試行・冪等性を一つのクライアント層へ集約するまでの設計を、実装コードとともに残しておきます。

生成コードの fetch が抱える弱さ

Rork が最初に吐く通信コードは、おおむね次のような形に落ち着きます。

async function getProfile() {
  const res = await fetch(`${API}/me`, {
    headers: { Authorization: `Bearer ${token}` },
  });
  return res.json();
}

このコードには三つの弱点があります。第一に、トークンが切れても更新せず、エラーをそのまま返します。第二に、電波が一瞬切れただけの一時的な失敗でも、即座にあきらめます。第三に、送信ボタンの二度押しやタイムアウト後の再送で、同じ操作が二重に実行され得ます。これらを各画面でばらばらに対処すると、コードが散らかり、抜け漏れも生まれます。だからこそ、通信の面倒を見る層を 1 か所にまとめます。

トークンの自動更新を 1 か所に集約する

最初に解くのは、トークン切れです。サーバーが 401 を返したら、リフレッシュトークンで新しいアクセストークンを取り、元のリクエストをやり直します。

ここで落とし穴になるのが、同時多発のリクエストです。画面復帰の瞬間に複数の通信が一斉に 401 を受け取ると、それぞれが更新を走らせ、更新が何度も重なってしまいます。これを避けるため、更新中は 1 本の Promise を共有させます。

let refreshing: Promise<string> | null = null;
 
async function refreshToken(): Promise<string> {
  if (!refreshing) {
    refreshing = fetch(`${API}/auth/refresh`, {
      method: "POST",
      body: JSON.stringify({ refreshToken: store.refreshToken }),
    })
      .then((r) => r.json())
      .then((d) => {
        store.accessToken = d.accessToken;
        return d.accessToken as string;
      })
      .finally(() => {
        refreshing = null;
      });
  }
  return refreshing;        // 同時に来た呼び出しは同じ更新を待ちます
}

refreshing を共有することで、何本のリクエストが同時に 401 を受けても、実際の更新は 1 回に収まります。私の環境では、この一手だけで「ログインし直してください」の報告がほぼ止まりました。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
トークン更新を 1 か所に集約し、同時多発リクエストでも更新を 1 回に抑える実装
再試行すべきエラーの見分け方と、指数バックオフ+上限の具体的な書き方
二重送信による重複課金や重複投稿を防ぐ冪等性キーの設計
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

開発ツール2026-06-19
Rork が生成したフォーム画面を実戦仕様に直す — react-hook-form と zod で入力体験を立て直す
Rork が出力するフォーム画面は、useState の積み重ねと素朴なバリデーションで一見動きます。けれど実機ではキーボードが送信ボタンを隠し、入力のたびに全体が再描画されます。react-hook-form と zod で作り直す手順を、個人開発の運用視点でまとめました。
開発ツール2026-06-19
Rork で作ったリストのスクロールが重い — 画像キャッシュとプリフェッチの設計
Rork が生成した FlatList は画像が増えるとスクロールがカクつきます。expo-image のキャッシュ、recyclingKey、プリフェッチ、FlashList への移行を実機の数値とともに整理し、滑らかさを取り戻すまでの設計を残しました。
開発ツール2026-06-19
Rork が生成した画面に、壊さないための最小限の自動テストを足す
Rork で新しい画面を1つ足したつもりが、離れた場所の課金判定が静かに壊れていた——そんな事故を防ぐために、生成コードへ最小限の自動テストを後付けする手順をまとめました。Jest と React Native Testing Library で、壊れると痛い3か所だけを守る現実的な設計です。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →