RORK LABEN
BUILD — Rork Maxがネイティブ Swift アプリを生成し、React Nativeでは届きにくい領域に踏み込めますPLATFORM — Rork MaxはiPhone・iPad・Apple Watch・Apple TV・Vision Pro・iMessageに対応しますNATIVE — HealthKit・Core ML・NFC・Dynamic Island・Live Activitiesなどのネイティブ機能が使えますTEST — ブラウザ内ストリーミングiOSシミュレータで、XcodeやMacなしでテストできますDEPLOY — ビルド・証明書・App Store申請までの自動化で公開までを簡素化しますPRICE — 無料で開始でき、有料プランは$25/月〜、Rork Maxは$200/月ですBUILD — Rork Maxがネイティブ Swift アプリを生成し、React Nativeでは届きにくい領域に踏み込めますPLATFORM — Rork MaxはiPhone・iPad・Apple Watch・Apple TV・Vision Pro・iMessageに対応しますNATIVE — HealthKit・Core ML・NFC・Dynamic Island・Live Activitiesなどのネイティブ機能が使えますTEST — ブラウザ内ストリーミングiOSシミュレータで、XcodeやMacなしでテストできますDEPLOY — ビルド・証明書・App Store申請までの自動化で公開までを簡素化しますPRICE — 無料で開始でき、有料プランは$25/月〜、Rork Maxは$200/月です
記事一覧/アプリ開発
アプリ開発/2026-07-02上級

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

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

Rork Max203パスキーWebAuthnAuthenticationServicesSwift33認証13

プレミアム記事

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

パスキーに切り替えてから、その問い合わせはほぼ消えました。ユーザーは 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-06-28
オンデバイス Core ML を、起動の重さとサーマルで破綻させない設計
Rork Max が生成するネイティブ Swift でオンデバイス Core ML を載せると、精度よりも先に「最初の推論が遅い」「使っていると熱で重くなる」という壁にぶつかります。コールドスタートとサーマル予算を前提にした設計を、動く Swift とともに整理します。
アプリ開発2026-06-18
Rork Max で Apple TV のアンビエント表示アプリを組み立てる
Rork Max が生成するネイティブ Swift を土台に、Apple TV で静かに流し続けるアンビエント表示アプリを設計します。Top Shelf・フォーカスエンジン・途切れない映像ループの実装を、運用で気づいた勘どころとともにまとめました。
アプリ開発2026-06-16
Rork Max のアプリに Apple Wallet のスタンプカードを足す — 署名と更新の実装メモ
店舗のスタンプカードを Apple Wallet に入れたい——Rork Max が生成した Swift アプリから PassKit のパスを発行する際、難所はデザインではなく『署名』と『リモート更新』でした。実装の勘所を整理します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →