◉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-07-02上級

パスワードを預からないログインへ — Rork Max アプリにパスキー認証を組み込む実装手順

Rork Max が生成した Swift アプリに AuthenticationServices のパスキー認証を組み込む手順です。Associated Domains の設定から WebAuthn サーバー検証、実機テストの落とし穴まで動くコードでまとめました。

Rork Max236パスキーWebAuthnAuthenticationServicesSwift48認証15

✦ プレミアム記事

運営中のアプリのサポート窓口で、いちばん多い問い合わせが「パスワードを忘れました」だった時期があります。機能の不具合ではなく、ログインできないことへの返信に毎週時間を使う。個人開発では、この種の目立たない運用コストが積もっていきます。

パスキーに切り替えてから、その問い合わせはほぼ消えました。ユーザーは Face ID をかざすだけで、私のサーバーにはパスワードという「漏れたら終わりの秘密」がそもそも存在しません。ここでは、Rork Max が生成した Swift アプリにパスキー認証を組み込んだ手順を、私自身がつまずいた箇所まで含めて書きます。

パスキーで何が変わり、何は変わらないのか

パスキーは WebAuthn の公開鍵認証をベースにした仕組みです。端末側で秘密鍵を生成し、サーバーには公開鍵だけを渡します。ログイン時はサーバーが出すチャレンジに端末が署名し、サーバーが公開鍵で検証する。パスワードのように「同じ秘密を両側で持つ」構造ではないため、サーバーが漏洩しても資格情報は盗まれません。秘密鍵は iCloud キーチェーンで同期されるので、機種変更でも引き継がれます。

一方で、変わらないものもあります。サーバーは依然として必要です。チャレンジの発行と署名の検証、公開鍵の保存はサーバーの仕事で、ここを省略した「クライアントだけのパスキー」は成立しません。Rork Max はネイティブ Swift のクライアント側を生成してくれますが、この記事の半分はサーバー側の話になります。

なお「Apple のアカウントで代わりにログインする」方式とは役割が違います。あちらは ID 連携、パスキーは自分のアカウント基盤をそのまま無パスワード化する技術です。ID 連携側の実装は Sign in with Apple のサーバー検証とアカウント削除の実装 に書いたので、両方を並べる設計も検討できます。

最初に整える土台 — Associated Domains と AASA ファイル

パスキーは「どのドメインの資格情報か」をアプリとサーバーの双方で一致させる必要があります。この紐づけが Associated Domains です。手順は 3 点セットで覚えています。

  1. アプリ側に webcredentials:example.com の Associated Domains を持たせる
  2. サーバー側の https://example.com/.well-known/apple-app-site-association に AASA ファイルを置く
  3. AASA にアプリの App ID(TeamID.BundleID)を記載する

AASA ファイルはこれだけの JSON です。

{
  "webcredentials": {
    "apps": ["YOUR_TEAM_ID.com.example.yourapp"]
  }
}

配信時の条件が地味に厳格で、私は最初ここで半日を失いました。リダイレクトなしの HTTPS で返すこと、Content-Type: application/json で返すこと、パスは /.well-known/ 直下であること。拡張子は付けません。

Rork Max の場合、Xcode を開かずにビルドまで進む構成なので、Associated Domains は生成時のプロンプトで明示します。「webcredentials の Associated Domains として example.com を含めてください」と要求し、生成後に entitlements へ反映されているかを確認してから先へ進む。ケーパビリティが絡む機能は、生成コードが正しくても署名設定が欠けると実機で沈黙する、というのが Core NFC のときから変わらない教訓です。

✦

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

この記事の続きを読む

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

この記事で得られること
✦webcredentials と apple-app-site-association を最短で正しく通すための設定チェックリスト
✦登録とログインの両フローを Swift と Node.js(@simplewebauthn/server)の動くコードで最後まで通す
✦RP ID 不一致のエラー 1004 や AASA キャッシュなど、実機テストで詰まる点の切り分け手順
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

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

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

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

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

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

関連記事

◇ アプリ開発2026-09-29
起動のたびに一瞬ログイン画面が出る expo-router アプリを、Protected routes と「まだ分からない」の三状態で組み直す
ログイン済みなのに起動直後にログイン画面が一瞬出る、ログアウトしても画面が変わらない。expo-router の Protected routes に Supabase の認証状態を「不明」込みの三つで渡し、_layout.tsx の置き場所まで含めて直した手順です。
⬡ 開発ツール2026-04-05
Rork Max × WidgetKit・ライブアクティビティ実装ガイド 2026 — Dynamic Island 対応まで
Rork Max で iOS Widget・ロック画面ウィジェット・Dynamic Island 対応のライブアクティビティを実装した記録。Timeline の焼き込み設計、APNs のヘッダーと優先度、push-to-start、stale-date の扱いまで実運用の判断を残します。
◇ アプリ開発2026-10-15
購読が切れても広告が戻りませんでした。「いま ad-free でなければ false」と書いていた、判定の向きを直した記録
購読が失効しても広告非表示のままになる不具合の原因は、判定の向きの逆転でした。二系統の購入確認を待って合成し、失敗した回は前回を保つ部品を、手元で動かして確かめた記録です。