◉RORK LABEN
●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SDK 58 — Beta が 09/15 から。stable の案内はまだなく、Expo Go でのプロジェクト実行は 09/03 からログインが必要です●WIDGET — iOS のウィジェットが本番ビルドだけ真っ黒になる原因を追った報告が出ています●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SDK 58 — Beta が 09/15 から。stable の案内はまだなく、Expo Go でのプロジェクト実行は 09/03 からログインが必要です●WIDGET — iOS のウィジェットが本番ビルドだけ真っ黒になる原因を追った報告が出ています●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…
記事一覧/開発ツール
⬡ 開発ツール/2026-05-03上級

Rork アプリの Sign in with Apple を、サーバー検証とアカウント削除まで本気で実装するガイド

Sign in with Apple をクライアントだけで済ませたアプリは、審査より先にサーバー側で綻びます。サーバーが発行する nonce、ID トークンの検証、authorizationCode の即時交換、revoke を伴うアカウント削除、Apple からのサーバー間通知の受け取りまで、Cloudflare Workers の動くコードで順に組みます。

Sign in with Apple認証15JWTApp Store審査8Cloudflare Workers25

✦ プレミアム記事

nonce の検証コードを書いていた夜、いちばん長く手が止まったのは暗号の部分ではありませんでした。その nonce を、いったい誰が作るのか——そこでした。クライアントが作った値を、サーバーが「発行済みか」と探しに行く。読み返すと、最初から噛み合っていない構成でした。いま思えば、暗号の細部より先に決めるべきだったのは、値の出どころだったのかもしれません。

Sign in with Apple は、ボタンを置くだけなら十分もかかりません。ただ、サーバーが ID トークンを確かめ、アカウント削除のときに Apple へ連携解除を伝えるところまで含めると、一つの認証基盤を組む作業になります。Rork が生成してくれる画面はたいてい前半だけを満たしていて、後半は自分で埋めることになります。

このガイドでは、クライアントに expo-apple-authentication、サーバーに Cloudflare Workers(Hono と D1)を使い、nonce の発行から ID トークンの検証、authorizationCode の交換、revoke を伴う削除、Apple からの通知の受信までを順に組んでいきます。Vercel Edge Functions や AWS Lambda でも、考え方はそのまま使えます。

審査で見られる点を、正確に押さえる

リジェクトの文面は定型ではなく、何が足りないのかを自分で突き止めることになりがちです。先に、関係するガイドラインの骨格を確認しておきます。文面は改訂されるため、最終的には App Store Review Guidelines の最新版でご確認ください。

  • 4.8(ログインサービス): サードパーティや SNS のログインを使うアプリは、同等の選択肢として、プライバシーに配慮したログインサービスを併せて提供する必要があります。2024 年 1 月の改訂以降の書き方は「Sign in with Apple そのもの」ではなく、収集する情報を氏名とメールアドレスに限ること、メールアドレスを非公開にできること、同意なしに広告目的でアプリ内の行動を追跡しないこと、という条件を満たす同等のサービスです。Sign in with Apple はその条件を満たす最も手軽な手段、という位置づけです。自社のアカウントだけを使うアプリは対象外です
  • 5.1.1(v)(アカウント削除): アカウントを作成できるアプリは、アプリ内からアカウントを削除できる必要があります。2022 年 6 月 30 日以降は必須で、Sign in with Apple を使っている場合は、削除の開始時に Sign in with Apple の REST API でトークンを取り消す(revoke する)ことも求められています。「何タップ以内」といった数値の規定は、私の知る限りありません。見つけやすい場所にあること、が基準です
  • ID トークンの検証: Apple のドキュメントは、サーバーで JWS 署名と各クレームを検証する手順を示しています。クライアントが受け取った値をそのまま信じて DB に書く構成は、この手順を飛ばしていることになります

加えて、expo-apple-authentication は Expo Go では確認しづらく、ネイティブのエンタイトルメントが必要です。app.json の ios.usesAppleSignIn を有効にし、Apple Developer の App ID で Sign in with Apple を有効にしたうえで、開発ビルドを作り直します。手順は Expo Dev Client の導入記事 にまとめています。

全体像 — 4 つの層と、5 つの値の寿命

役割を揃えておくと、あとで不具合を切り分けるのが格段に楽になります。

  • 層 1: 画面(Rork が生成する React Native): ボタンを表示し、signInAsync() を呼び、identityToken と authorizationCode を受け取ります
  • 層 2: クライアントの前処理: サーバーから nonce を受け取り、SHA-256 でハッシュして Apple に渡します
  • 層 3: サーバーの検証(Workers + Hono): nonce を消費し、ID トークンを検証し、authorizationCode を交換して、自前のセッションを発行します
  • 層 4: 削除と通知: アカウント削除時の revoke と、Apple から届くサーバー間通知を扱います

この 4 つの層を、次の 5 つの値が行き来します。寿命が違うので、どれをどこに残すのかを表にしておきます。

値作る人行き先寿命・扱い
raw nonceサーバークライアントへ渡し、検証時にサーバーへ戻る5 分・一度だけ使える
hashed nonceクライアントApple へ渡り、ID トークンの nonce クレームに入る保存しない
identityTokenAppleサーバーで署名とクレームを検証検証したら捨てる
authorizationCodeAppleサーバーで refresh_token と交換5 分・一度だけ使える
refresh_tokenApple(交換の結果)暗号化して D1 に保存削除時の revoke まで保持

authorizationCode が 5 分で失効し、一度しか使えないという点は、見落とされやすい部分です。ログインの応答を返したあとで交換しようとしても、もう間に合いません。

✦

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

この記事の続きを読む

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

この記事で得られること
✦nonce を「サーバーが発行し、一度だけ使わせる」構成と、D1 の DELETE ... RETURNING で原子的に消費する書き方が分かります
✦ID トークンの検証(jose)から、5 分で失効する authorizationCode の即時交換、refresh_token の暗号化保存までを、一続きの動くコードで組めます
✦ガイドライン 5.1.1(v) のアカウント削除を、revoke が失敗しても再試行できる二段階の削除として実装し、Apple 側からのサーバー間通知も受け取れます
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

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

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

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

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

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

関連記事

⬡ 開発ツール2026-05-23
Rork 生成 Expo アプリの Privacy Manifest を SDK 連鎖まで監査する — 提出前1日で洗い切る個人開発者の手順
Rork が生成する Expo アプリの依存 SDK を Privacy Manifest 観点で全数監査する手順です。Required Reason API の事前検出、ITMS-91053 と ITMS-91061 の切り分け、npm では見えない Pod を Podfile.lock から拾う照合まで、個人開発の運用としてまとめました。
⬡ 開発ツール2026-05-09
Rork の A/B テスト基盤を GrowthBook と PostHog でゼロから組む
Firebase に頼らず、GrowthBook と PostHog をオープンソースで組み合わせて Rork アプリの A/B テスト基盤を構築する手順を、SDK 統合からベイズ統計の解釈、運用上の落とし穴までまとめました。
⬡ 開発ツール2026-04-30
Rork × AIモデレーション実装:UGCアプリで通報・自動審査・段階的制裁を本番投入する
Rork で作ったUGCアプリに、AIモデレーション・通報・段階的制裁を本番品質で組み込む実践ガイド。OpenAI Moderation・Perspective API・Cloudflare Workers Queueで設計する3層パイプラインを、コード付きで解説します。