> ## Documentation Index
> Fetch the complete documentation index at: https://translations.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Auth0.swift SDK を使用して iOS または macOS アプリケーションにログイン機能を追加する

export const HowToSchema = () => <script type="application/ld+json">
    {'{"@context":"https://schema.org","@type":"HowTo"}'}
  </script>;

export const AuthCodeGroup = ({children, dropdown}) => {
  const [processedChildren, setProcessedChildren] = useState(children);
  useEffect(() => {
    let unsubscribe = null;
    function init() {
      unsubscribe = window.autorun(() => {
        const processChildren = node => {
          if (typeof node === "string") {
            let processedNode = node;
            for (const [key, value] of window.rootStore.variableStore.values.entries()) {
              const escapedKey = key.replaceAll(/[.*+?^${}()|[\]\\]/g, (String.raw)`\$&`);
              processedNode = processedNode.replaceAll(new RegExp(escapedKey, "g"), value);
            }
            return processedNode;
          } else if (Array.isArray(node)) {
            return node.map(processChildren);
          } else if (node && node.props && node.props.children) {
            return {
              ...node,
              props: {
                ...node.props,
                children: processChildren(node.props.children)
              }
            };
          }
          return node;
        };
        setProcessedChildren(processChildren(children));
      });
    }
    if (window.rootStore) {
      init();
    } else {
      window.addEventListener("adu:storeReady", init);
    }
    return () => {
      window.removeEventListener("adu:storeReady", init);
      unsubscribe?.();
    };
  }, [children]);
  return <CodeGroup dropdown={dropdown}>{processedChildren}</CodeGroup>;
};

<HowToSchema />

<Accordion title="AI を使って Auth0 を統合する" icon="microchip-ai" iconType="solid" defaultOpen>
  Claude Code、Cursor、GitHub Copilot などの AI コーディングアシスタントを使えば、[agent skills](https://agentskills.io/home) を利用して数分で Auth0 認証を自動追加できます。

  **インストール:**

  ```bash theme={null}
  npx skills add auth0/agent-skills --skill auth0-quickstart --skill auth0-swift
  ```

  **次に、AI アシスタントに次のように依頼します。**

  ```text theme={null}
  Add Auth0 authentication to my iOS app
  ```

  AI アシスタントが Auth0 アプリケーションを自動的に作成し、認証情報を取得して、Auth0.swift SDK 依存関係の追加、Auth0.plist の設定、コールバック URL の設定、ログイン/ログアウトフローの実装まで行います。[agent skills の完全なドキュメント →](/ja/docs/quickstart/agent-skills)
</Accordion>

<div id="get-started">
  ## はじめに
</div>

<Steps>
  <Step title="新しいプロジェクトを作成" stepNumber={1}>
    このクイックスタート用に、新しい iOS または macOS のプロジェクトを作成します。

    **Xcode で:**

    1. **File** → **New** → **Project** (または **⌘+Shift+N**)
    2. 次のいずれかを選択します。
       * **iOS** タブ → **App** テンプレート
       * **macOS** タブ → **App** テンプレート
    3. プロジェクトを設定します。
       * **Product Name**: `Auth0-Sample`
       * **Interface**: SwiftUI
       * **Language**: Swift
       * **Use Core Data**: チェックなし
       * **Include Tests**: チェックあり (推奨)
    4. 保存場所を選択して **Create** をクリックします

    <Tip>
      これにより、SwiftUI と Swift Package Manager をサポートする標準的なアプリが作成され、Auth0 との統合に最適です。
    </Tip>
  </Step>

  <Step title="Auth0 SDK を追加" stepNumber={2}>
    お好みのパッケージマネージャーを使用して、Auth0 SDK をプロジェクトに追加します。

    <Tabs>
      <Tab title="Swift Package Manager">
        **Xcode で:**

        1. **File** → **Add Package Dependencies...** (または **⌘+Shift+K**)
        2. Auth0 SDK の URL を入力します。
           ```
           https://github.com/auth0/Auth0.swift
           ```
        3. **Add Package** → アプリのターゲットを選択 → **Add Package**
      </Tab>

      <Tab title="CocoaPods">
        1. プロジェクトディレクトリに `Podfile` を作成します。
           ```ruby Podfile theme={null}
           platform :ios, '14.0' # macOS の場合は platform :osx, '11.0'
           use_frameworks!

           target 'YourApp' do
             pod 'Auth0', '~> 2.0'
           end
           ```
        2. 依存関係をインストールします。
           ```bash theme={null}
           pod install
           ```
        3. 生成された `.xcworkspace` ファイルを開きます (`.xcodeproj` ではなく)
      </Tab>

      <Tab title="Carthage">
        1. プロジェクトディレクトリに `Cartfile` を作成します。
           ```text Cartfile theme={null}
           github "auth0/Auth0.swift" ~> 2.0
           ```
        2. Carthage を実行します。
           ```bash theme={null}
           carthage update --platform iOS --use-xcframeworks
           ```
           macOS の場合は `--platform macOS` を使用します。
        3. 生成された `Auth0.xcframework` を `Carthage/Build` から Xcode プロジェクトにドラッグします
        4. ターゲットの **General** 設定で、`Auth0.xcframework` を **Frameworks, Libraries, and Embedded Content** に追加します
      </Tab>
    </Tabs>
  </Step>

  <Step title="Auth0 を設定する" stepNumber={3}>
    新しい Auth0 アプリケーションを作成し、コールバックURLを設定します。

    1. [Auth0 Dashboard](https://manage.auth0.com/dashboard/) に移動します
    2. **Applications** > **Create Application** > 名前を入力し、**Native** を選択して **Create** をクリックします
    3. **Settings** タブで、**クライアントID** と **ドメイン** を控えます
    4. 次のURLを **Allowed Callback URLs** に追加します:

    <Tabs>
      <Tab title="iOS">
        ```
        https://{yourDomain}/ios/YOUR_BUNDLE_IDENTIFIER/callback,
        YOUR_BUNDLE_IDENTIFIER://{yourDomain}/ios/YOUR_BUNDLE_IDENTIFIER/callback
        ```
      </Tab>

      <Tab title="macOS">
        ```
        https://{yourDomain}/macos/YOUR_BUNDLE_IDENTIFIER/callback,
        YOUR_BUNDLE_IDENTIFIER://{yourDomain}/macos/YOUR_BUNDLE_IDENTIFIER/callback
        ```
      </Tab>
    </Tabs>

    5. 次のURLを **Allowed Logout URLs** に追加します:

    <Tabs>
      <Tab title="iOS">
        ```
        https://{yourDomain}/ios/YOUR_BUNDLE_IDENTIFIER/callback,
        YOUR_BUNDLE_IDENTIFIER://{yourDomain}/ios/YOUR_BUNDLE_IDENTIFIER/callback
        ```
      </Tab>

      <Tab title="macOS">
        ```
        https://{yourDomain}/macos/YOUR_BUNDLE_IDENTIFIER/callback,
        YOUR_BUNDLE_IDENTIFIER://{yourDomain}/macos/YOUR_BUNDLE_IDENTIFIER/callback
        ```
      </Tab>
    </Tabs>

    6. **Save Changes** をクリックします
  </Step>

  <Step title="アプリケーションの認証情報を設定" stepNumber={4}>
    プロジェクトディレクトリに`Auth0.plist`を作成します:

    ```xml Auth0.plist theme={null}
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
        <key>ClientId</key>
        <string>YOUR_AUTH0_CLIENT_ID</string>
        <key>Domain</key>
        <string>{yourDomain}</string>
    </dict>
    </plist>
    ```

    `Auth0.plist` を Xcode にドラッグし、"Add to target" がチェックされていることを確認します。
  </Step>

  <Step title="認証サービスを作成する" stepNumber={5}>
    `AuthenticationService.swift` を作成して、ログイン、ログアウト、およびトークンの保存を処理します。

    <Info>
      **トークンの保存には `CredentialsManager` を使用します。** `CredentialsManager` クラスは認証情報を Keychain に安全に保存し、期限切れのアクセストークンを自動的に更新します。必ずこれを使用してください。トークンをメモリ、`UserDefaults`、または `localStorage` に保存しないでください。
    </Info>

    1. プロジェクトを右クリック → **New File...** → **Swift File**
    2. 名前を `AuthenticationService` にします
    3. 内容を次のように置き換えます。

    ```swift AuthenticationService.swift expandable lines theme={null}
    import Foundation
    import Auth0
    import Combine

    @MainActor
    class AuthenticationService: ObservableObject {
        @Published var isAuthenticated = false
        @Published var user: User?
        @Published var isLoading = false
        @Published var errorMessage: String?
        
        private let credentialsManager = CredentialsManager(authentication: Auth0.authentication())
        
        init() {
            Task {
                await checkAuthenticationStatus()
            }
        }
        
        private func checkAuthenticationStatus() async {
            isLoading = true
            defer { isLoading = false }
            
            guard let credentials = try? await credentialsManager.credentials() else {
                isAuthenticated = false
                return
            }
            
            isAuthenticated = true
            // IDトークンからユーザー情報を取得する
            user = credentials.user
        }
        
        func login() async {
            isLoading = true
            errorMessage = nil
            defer { isLoading = false }
            
            do {
                let credentials = try await Auth0
                    .webAuth()
                    .scope("openid profile email offline_access")
                    .start()
                
                _ = credentialsManager.store(credentials: credentials)
                isAuthenticated = true
                // IDトークンからユーザー情報を取得する
                user = credentials.user
            } catch {
                errorMessage = "Login failed: \(error.localizedDescription)"
            }
        }
        
        func logout() async {
            isLoading = true
            defer { isLoading = false }
            
            do {
                try await Auth0
                  .webAuth()
                  .clearSession()
                _ = credentialsManager.clear()
                isAuthenticated = false
                user = nil
            } catch {
                errorMessage = "Logout failed: \(error.localizedDescription)"
            }
        }
    }
    ```
  </Step>

  <Step title="認証フローを設定する（任意）" stepNumber={6}>
    ユーザーエクスペリエンスを向上させるために、次の方法でシステムアラートを最小限に抑えられます。

    1. Universal Links を使用する: リダイレクト中に表示される「"AppName"で開きますか？」というプロンプトが表示されなくなります。注: ASWebAuthenticationSession の権限アラートは引き続き表示されます。
    2. Ephemeral Sessions を使用する: すべての権限アラートが表示されなくなります。注: これによりシングルサインオン (SSO) と共有 Cookie は無効になります。

    <Tip>
      **この手順はスキップ**して、権限アラートが表示されるデフォルトの動作を使用できます。これは後で設定できます。
    </Tip>

    <Tabs>
      <Tab title="Universal Links">
        1. Auth0 Dashboard → **Applications** → アプリ → **Settings** → **Advanced Settings** → **Device Settings**
        2. **Apple Team ID** と **bundle identifier** を追加 → **Save**
        3. Xcode: Target → **Signing & Capabilities** → **+ Capability** → **Associated Domains**
        4. 追加: `webcredentials:{yourDomain}`

        <Warning>必要: 有料の Apple Developer アカウント、iOS 17.4+/macOS 14.4+</Warning>

        <Tip>
          本番環境のアプリに最適です。
        </Tip>
      </Tab>

      <Tab title="Ephemeral Session">
        `AuthenticationService.swift` のログイン呼び出しに `.useEphemeralSession()` を追加します。

        ```swift theme={null}
        // login() 関数内
        let credentials = try await Auth0
            .webAuth()
            .scope("openid profile email offline_access")
            .useEphemeralSession()
            .start()
        ```

        <Info>
          エフェメラルセッションを使用する場合、ログアウト時に `clearSession()` を呼び出す必要はありません。アプリから認証情報を消去するだけで十分です。削除する共有 Cookie はありません。
        </Info>

        <Tip>
          すぐに設定でき、アラートも表示されませんが、ユーザーは毎回ログインする必要があります (SSO なし) 。
        </Tip>
      </Tab>
    </Tabs>
  </Step>

  <Step title="アプリを実行する" stepNumber={8}>
    Xcode で **⌘+R** を押します。

    1. 「Log In」をタップ → 権限アラート (デフォルト設定を使用している場合) → 「続行」をタップ
    2. ブラウザーでログインを完了します
    3. プロファイルが表示されます
  </Step>
</Steps>

<Check>
  **チェックポイント**

  これで、iOS または macOS アプリで Auth0 ログインが完全に動作するようになりました！
</Check>

***

<div id="troubleshooting-advanced">
  ## トラブルシューティングと詳細設定
</div>

<Accordion title="よくある問題と解決策">
  ### ビルドエラー: 'Auth0' モジュールが見つからない

  **解決策**:

  1. **Swift Package Manager**: **Package Dependencies** を確認し、`Auth0.swift` が一覧に表示されていることを確認します
  2. **CocoaPods**: `.xcodeproj` ではなく `.xcworkspace` ファイルを開いていることを確認します
  3. **Carthage**: `Auth0.xcframework` が **Frameworks, Libraries, and Embedded Content** に追加されていることを確認します
  4. クリーンして再ビルドします: **⌘+Shift+K** の後に **⌘+R**
  5. 必要に応じて Xcode を再起動します

  ### アプリがクラッシュする: 'Auth0.plist not found'

  **修正方法**:

  1. `Auth0.plist` が Xcode のプロジェクトナビゲーター内にあることを確認します
  2. ファイルを選択 → Inspector → アプリのターゲットにチェックが入っていることを確認します
  3. `ClientId` キーと `Domain` キーに自分の値が設定されていることを確認します

  ### ブラウザーは開くがアプリに戻らない

  **修正方法**:

  1. Auth0 Dashboard のコールバック URL が、bundle identifier とプラットフォームに完全に一致していることを確認します
  2. iOS の場合: URL に `/ios/` を含めます。macOS の場合: `/macos/` を含めます
  3. Xcode の bundle identifier が Auth0 の設定と一致していることを確認します
  4. URL にタイプミスがないことを確認します (よくある例: コロンの抜け、誤ったドメイン形式)
  5. **カスタムドメインを使用している場合**: Auth0 ドメインではなく、カスタムドメインを使用していることを確認します

  ### 毎回権限アラートが表示される

  これは、カスタム URL スキームを使用する際の iOS/macOS の標準的なセキュリティ動作です。Universal Links または Ephemeral Sessions を使用してこのアラートを回避する方法については、**ステップ 6** を参照してください。
</Accordion>

<Accordion title="カスタムドメインの設定">
  [カスタムドメイン](/ja/docs/customize/custom-domains) を使用している場合は、すべての箇所で Auth0 ドメインの代わりにその値を使用してください。

  **例:** `tenant.auth0.com` ではなく `login.example.com` を使用します

  特定の機能を正しく動作させるには、これは**必須**です:

  * `Auth0.plist` をカスタムドメインで更新します
  * コールバック URL とログアウト URL にカスタムドメインを使用します
  * Universal Links には次を使用します: `webcredentials:login.example.com`
</Accordion>

<Accordion title="本番環境へのデプロイ">
  ### App Store 公開の準備

  * 権限アラートを回避するために Universal Links を設定します
  * 複数のプラットフォームバージョンとデバイスサイズでテストします
  * ネットワーク障害に対する適切なエラーハンドリングを実装します
  * 生体認証とともに Keychain を使用する場合は Privacy Usage の説明を追加します
  * 認証フローについては App Store Review Guidelines に従います

  ### セキュリティのベストプラクティス

  * 本番環境では機密性の高い認証データを決してログに出力しないでください
  * App Transport Security (ATS) に準拠するよう実装します
  * すべてのネットワークリクエストに HTTPS を使用します
  * Auth0 API 証明書のピン留めは**しないでください** - [Auth0 はこの方法を推奨していません](/ja/docs/troubleshoot/product-lifecycle/past-migrations#avoid-pinning-or-fingerprinting-tls-certificates-for-auth0-endpoints)

  ### パフォーマンスの最適化

  * すべての非同期処理で、UI 更新に `@MainActor` が適切に使用されています
  * `@Published` プロパティでは適切なメモリ管理が行われています
  * 認証情報はオフラインアクセス用に Keychain に安全にキャッシュされます
  * ユーザープロファイルは IDトークン から取得されます (追加のネットワークリクエストは不要)
</Accordion>

<Accordion title="高度な統合">
  ### 生体認証による Keychain セキュリティの強化

  保存された認証情報にアクセスする際に、Face ID または Touch ID を必須にします。

  ```swift theme={null}
  private let credentialsManager: CredentialsManager = {
      let manager = CredentialsManager(authentication: Auth0.authentication())
      manager.enableBiometrics(
          withTitle: "Unlock with Face ID", 
          cancelTitle: "Cancel", 
          fallbackTitle: "Use Passcode"
      )
      return manager
  }()
  ```

  有効にすると、SDK が保存済みの認証情報を取得する前に、ユーザーは生体認証を行う必要があります。

  ### 自動トークン更新

  `CredentialsManager` は、有効期限が切れたアクセストークンを自動的に更新します。

  ```swift theme={null}
  // 認証情報を取得 - 期限切れの場合は自動的に更新
  func getAccessToken() async throws -> String {
      let credentials = try await credentialsManager.credentials()
      return credentials.accessToken
  }
  ```

  アクセストークンが必要な API 呼び出しでは、このパターンを使用してください。

  ### App Extension 間での認証情報の共有

  アクセストークンを必要とするウィジェット、App Extension、またはバックグラウンドタスク向けです。

  ```swift theme={null}
  // App Group を使って共有認証情報マネージャーを作成
  let credentialsManager = CredentialsManager(
      authentication: Auth0.authentication(),
      storeKey: "credentials",
      storage: .shared(withIdentifier: "group.com.example.myapp")
  )
  ```

  **要件:**

  1. すべてのターゲットで Xcode の **App Groups** 機能を有効にする
  2. ターゲット間で同じ App Group 識別子を使用する
  3. 各ターゲットで共有 `CredentialsManager` を設定する

  ### 認証フローオプションの比較

  | 機能                      | Universal Links    | Ephemeral Session | デフォルト (アラート) |
  | ----------------------- | ------------------ | ----------------- | ------------ |
  | 権限アラート                  | 軽減される (リダイレクト確認なし) | なし                | すべてのアラートを表示  |
  | SSO サポート                | はい                 | いいえ               | はい           |
  | Apple Developer Account | 必須                 | 不要                | 不要           |
  | ユーザー体験                  | 最良                 | 良好                | 許容範囲         |
  | セットアップの複雑さ              | 中程度                | 簡単                | 簡単           |
  | プライベートブラウジング対応          | はい                 | はい                | いいえ          |

  **推奨事項:**

  * **SSO を使用する本番アプリ**: Universal Links (より優れた UX、SSO をサポート、Apple Developer Account が必要)
  * **SSO を使用しない本番アプリ**: Ephemeral Sessions (アラートなし、セットアップが簡単)
  * **テスト/開発**: Ephemeral Sessions (セットアップが迅速で、最もすっきりした UX)
  * **クイックスタート/プロトタイピング**: アラート付きのデフォルト設定 (セットアップ不要、後で移行可能)
</Accordion>
