コンテンツへスキップ
supastack
ドキュメントを閲覧
モバイルExpo

For AI agents: fetch the complete documentation index at /llms.txt, the full documentation corpus at /llms-full.txt, the agent skill at /skill.md, or this page as Markdown at /ja/docs/mobile/passkeys.md (or send Accept: text/markdown).

パスキーサインイン

ブラウザーハンドオフでセッションをアプリに戻す、パスワードレスのサインイン。

このガイドについて質問
開くアプリ

ハンドオフの仕組み

パスキーのサインインはアプリで始まり、システムブラウザーで完了します。アプリは WebBrowser.openAuthSessionAsync を通じて {API URL}/auth?mobile_callback=<deep link> を開き、Web ページがサインイン方法を完了すると GET /api/auth/mobile-handoff が呼び出され、セッション Cookie と state ノンスを載せて <scheme>://auth/callback へリダイレクトで戻ります。

試行ごとに新しいノンスが生成され、往復で変わらず戻る必要があります — state パラメーターが一致しない場合は stateMismatch として拒否されるため、古い、または偽造されたコールバックはセッションを注入できません。返された Cookie は、Better Auth Expo クライアントが使うのと同じ SecureStore の Cookie ジャー(supastack.auth_cookie)に統合され、その後セッションストアに通知されてサインイン済みのアプリが描画されます。

ブラウザーシートが閉じられた場合は、エラーではなく静かな cancelled 結果として解決されるため、そのときはサインイン画面を変えずにそのままにしてください。

# apps/mobile/.env.local
EXPO_PUBLIC_APP_SCHEME=supastack

# apps/web/.env.local — server side
AUTH_PASSKEY_ENABLED=true
MOBILE_ALLOWED_ORIGINS=

許可リストを両側で一致させる

コールバック先は両側で検証されます。アプリは <scheme>://auth と設定済みの本番オリジンだけを受け付け、サーバーは EXPO_PUBLIC_APP_SCHEME と MOBILE_ALLOWED_ORIGINS から構築した同じリストを確認します。資格情報を含むコールバック、不明なスキーム、類似したサフィックスは、Cookie が移動する前に拒否されます。

本番環境では MOBILE_ALLOWED_ORIGINS が必須で、ローカルではない正確な HTTPS オリジンを列挙する必要があります — ワイルドカードは受け付けられません。アプリはバンドル済みで出荷される一方、サーバーはリクエストごとに環境を読むため、スキームやオリジンの変更にはアプリの新しいビルドとサーバーのデプロイの両方が必要です。片側だけを変えると、ハンドオフは閉じた状態で失敗します。

その他のパスワードレス方式

同じサインイン画面では、メールのワンタイムコード(requestEmailOtp の後に verifyEmailOtp)と、callbackURL を指定した signIn.social による Apple または Google のソーシャルサインインも提供されます。サーバーで AUTH_PASSKEY_ENABLED=true の場合にパスキーが表示されます。アカウントのパスキーと二要素の設定は、引き続き Web アプリの「設定 → セキュリティ」にあります。

検証とトラブルシューティング

対象のビルドで、コールドスタートのコールバック、実行中のアプリへの復帰、キャンセルされたブラウザーシート、期限切れのセッションを試してください。型付きの失敗 — passkeyUnavailable、browserFailed、untrustedCallback、missingCookie、malformedCookie、cookieStoreFailed — はそれぞれ異なる断絶を表します。stateMismatch はノンスが往復しなかったこと、つまり試行が正しく拒否されたことを意味します。

すべてのハンドオフが拒否される場合は、出荷したビルドの EXPO_PUBLIC_APP_SCHEME とサーバー側のスキームおよび MOBILE_ALLOWED_ORIGINS を比較してください — 片側だけを再デプロイすると、この組み合わせがずれます。

よくある質問

14 件の質問

supastack とは何ですか?

supastack は AI SaaS 製品を構築するためのモジュラー基盤です。共通インフラをまとめて提供するので、製品固有の機能に集中できます。

Web とモバイルに対応していますか?

はい。supastack には Web とモバイル体験の出発点として Next.js アプリと Expo アプリが含まれています。

どの認証が含まれていますか?

Better Auth がメール/パスワード、OTP、ソーシャルログインをカバーします。個人ワークスペースはアカウントと一緒にプロビジョニングされ、初日からレコードが境界内に収まります。

AI はどうサポートされていますか?

supastack には設定可能なマルチプロバイダー AI、使用量追跡、予算、暗号化された自前キー(BYOK)サポートが含まれています。

サブスクリプションはどう管理されますか?

このキット上に構築された製品では、Stripe 課金・サブスクリプション・権限が有料アクセスの基盤になります。プロバイダーの秘密はサーバー側に留まります。

製品固有のコードはどこに置きますか?

製品固有の機能は別のコードベースに置き、製品側が supastack の基本モジュールを設定・統合します。

supastack の価格は?

キットは生涯アップデート付きの一回払いです:シングルスタック 249 ドル(Next.js(Web)、Expo(iOS・Android)、Tauri(macOS・Windows デスクトップ)の各リポジトリから1つ選択)、デュアルスタック 398 ドル(任意の2リポジトリ)、またはフルバンドル 399 ドル(3つのリポジトリすべてと完全なモノレポ)、追加開発者シート 1 席 75 ドル。キットのサブスクリプションはありません。このサイトのチェックアウトはライセンスキーをメールで配信し、GitHub 招待でリポジトリアクセスを提供します。

ワークスペースはどうデータを囲いますか?

ユーザーレコードは workspaceId でスコープされます。認証、権限、AI 使用量、課金イベント、監査エントリは個人ワークスペースの境界内に留まります。

バックグラウンドジョブはどう機能しますか?

Trigger.dev が明示的なジョブランタイムです。JobRunner コントラクトは enqueue・status・cancel のみを約束し、ワークフロー意味論は Trigger.dev 固有で明示的です。

メールとアウトリーチの違いは?

トランザクションメールはタスク完了通知などの製品ワークフローをカバーします。コールドアウトリーチやキャンペーンは製品自身に属し、このキットのメールモジュールの外です。

モバイルの購入はどのように機能しますか?

モバイルでは RevenueCat によるネイティブ購入と復元に対応し、アクセス権をサーバーで検証します。公開前にストアアカウントを設定し、実機テストを完了してください。Web 課金は別に管理します。

AI プロバイダーのキーはどこにありますか?

BYOK 認証情報は暗号化され、サーバー側に留まります。キーはログでサニタイズされ、使用量と予算はワークスペースレベルで可視です。

チェックアウトで使える支払い方法は?

Stripe ホストのチェックアウトはカードを受け付け、Stripe アカウントでウォレットを有効にすれば Alipay と WeChat Pay も提供できます——中国の購入者に便利です。ウォレット認可は非同期で確定するため、決済完了と同時にライセンスページが更新されます。

返金を受けることはできますか?

リポジトリへのアクセス権を取得した後は、supastack は永久にあなたのものとなるため、返金はできません。ですがご安心ください。生涯アップデートを含む完全なソースコードを入手し、ご自身やクライアントのために無制限にプロダクトを構築・公開できます。コードの転売や、リポジトリをスターターキットやテンプレートとして再配布することのみ禁止されています。

JA
テーマ