メインコンテンツへスキップ

はじめに

1

新しいプロジェクトを作成

このクイックスタート用に新しい iOS または macOS プロジェクトを作成してください。Xcode で:
  1. FileNewProject(または ⌘+Shift+N
  2. 次のいずれかを選択します:
    • iOS タブ → App テンプレート
    • macOS タブ → App テンプレート
  3. プロジェクトを設定します:
    • Product Name: Auth0-Sample
    • Interface: SwiftUI
    • Language: Swift
    • Use Core Data: チェックを外す
    • Include Tests: チェックを入れる(推奨)
  4. 保存場所を選択し、Create をクリックします
これにより、SwiftUI を使用し Swift Package Manager に対応した標準的なアプリが作成され、Auth0 を統合するのに最適です。
2

Auth0 SDK を追加する

Auth0 ソフトウェア開発キット (SDK) を、好みのパッケージマネージャーを使ってプロジェクトに追加します。
Xcode で:
  1. FileAdd Package Dependencies…(または ⌘+Shift+K
  2. Auth0 SDK の URL を入力します:
    https://github.com/auth0/Auth0.swift
    
  3. Add Package → アプリのターゲットを選択 → Add Package
3

Auth0 を設定する

新しい Auth0 アプリケーションを作成して、コールバックURLを設定します。
  1. Auth0 Dashboard にアクセスします
  2. Applications > Create Application に進み、名前を入力して Native を選択し、Create をクリックします
  3. Settings タブで、Client IDDomain を確認しておきます
  4. 次のURLを Allowed Callback URLs に追加します:
https://{yourDomain}/ios/YOUR_BUNDLE_IDENTIFIER/callback,
YOUR_BUNDLE_IDENTIFIER://{yourDomain}/ios/YOUR_BUNDLE_IDENTIFIER/callback
  1. 次のURLを Allowed Logout URLs に追加します:
https://{yourDomain}/ios/YOUR_BUNDLE_IDENTIFIER/callback,
YOUR_BUNDLE_IDENTIFIER://{yourDomain}/ios/YOUR_BUNDLE_IDENTIFIER/callback
  1. Save Changes をクリックします
4

アプリケーションクレデンシャルの設定

プロジェクトディレクトリに Auth0.plist ファイルを作成します。
Auth0.plist
<?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」にチェックが付いていることを確認してください。
5

認証サービスの作成

AuthenticationService.swift を作成します。
  1. プロジェクトを右クリックし、New File…Swift File を選択します
  2. ファイル名を AuthenticationService にします
  3. 内容を次のコードに置き換えます:
AuthenticationService.swift
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 = "ログインに失敗しました: \(error.localizedDescription)"
        }
    }
    
    func logout() async {
        isLoading = true
        defer { isLoading = false }
        
        do {
            try await Auth0.webAuth().clearSession()
            _ = credentialsManager.clear()
            isAuthenticated = false
            user = nil
        } catch {
            errorMessage = "ログアウトに失敗しました: \(error.localizedDescription)"
        }
    }
}
6

UI コンポーネントの作成

UI ファイルを作成してコードを追加する
touch AuthenticatedView.swift UnauthenticatedView.swift ProfileCard.swift LoadingView.swift
7

認証フローの設定(任意)

ユーザーエクスペリエンスを向上させるために、次の方法でシステムアラートを最小限に抑えることができます。
  1. ユニバーサルリンクを使用する: リダイレクト中に表示される「“AppName” で開きますか?」というプロンプトをなくします。注: ASWebAuthenticationSession の許可アラートは引き続き表示されます。
  2. エフェメラルセッションを使用する: すべての許可アラートをなくします。注: Single Sign-On (SSO) と共有 Cookie が無効になります。
許可アラートありのデフォルトの動作を使用する場合は、この手順をスキップしてください。この設定は後から行うこともできます。
  1. Auth0 Dashboard → Applications → 対象のアプリ → SettingsAdvanced SettingsDevice Settings
  2. Apple Team IDbundle identifier を追加 → Save
  3. Xcode: Target → Signing & Capabilities+ CapabilityAssociated Domains
  4. webcredentials:{yourDomain} を追加
要件: 有料の Apple Developer アカウント、iOS 17.4+/macOS 14.4+
本番アプリに最適です。
8

アプリを実行する

Xcode で ⌘+R キーを押します。
  1. “Log In” をタップ → (デフォルト設定を使用している場合)アクセス許可のアラート → “Continue” をタップ
  2. ブラウザでログインを完了します
  3. プロファイルが表示されます!
チェックポイントこれで、iOS または macOS アプリに Auth0 によるログイン機能が完全に実装されました。

トラブルシューティングと詳細設定

ビルドエラー: ‘Auth0’ モジュールが見つかりません

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

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

対処方法:
  1. Auth0.plist が Xcode のプロジェクトナビゲーターに含まれていることを確認する
  2. ファイルを選択 → Inspector → アプリのターゲットにチェックが入っていることを確認する
  3. ClientIdDomain キーに、ご自身の値が設定されていることを確認する
  4. 代替案: プログラムによる設定を使用する(下記の「高度な統合」セクションを参照)

ブラウザは開くがアプリに戻ってこない

対処方法:
  1. Auth0 Dashboard のコールバック URL が、バンドル識別子およびプラットフォームと完全に一致していることを確認する
  2. iOS の場合: URL には /ios/ を含める。macOS の場合: /macos/ を含める
  3. Xcode のバンドル識別子が Auth0 の設定と一致していることを確認する
  4. URL にタイプミスがないことを確認する(よくある例: コロン抜け、ドメイン形式の誤り)
  5. カスタムドメイン利用時: Auth0 のドメインではなく、自身のカスタムドメインを使用していることを確認する

毎回パーミッションアラートが表示される

これはカスタム URL スキーム使用時の、標準的な iOS/macOS のセキュリティ動作です。ユニバーサルリンクまたはエフェメラルセッションを使用してこのアラートを解消するには、ステップ 6 を参照してください。
カスタムドメイン を使用している場合は、Auth0 のドメインの代わりに、その値をすべての箇所で使用してください。例: tenant.auth0.com の代わりに login.example.com を使用するこれは、特定の機能を正しく動作させるには 必須 です:
  • Auth0.plist をカスタムドメインで更新する
  • コールバック URL / ログアウト URL にカスタムドメインを使用する
  • ユニバーサルリンクでは webcredentials:login.example.com を使用する

App Store への準備

  • パーミッションアラートをなくすためにユニバーサルリンクを設定する
  • 複数のプラットフォームバージョンおよびデバイスサイズでテストする
  • ネットワーク障害に対する適切なエラー処理を実装する
  • 生体認証付きで Keychain を使用する場合は、プライバシー使用目的の説明を追加する
  • 認証フローに関して App Store Review ガイドラインに従う

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

  • 本番環境では機密性の高い認証データをログに出力しない
  • App Transport Security (ATS) に準拠する
  • すべてのネットワークリクエストで HTTPS を使用する
  • Auth0 の API 証明書を ピン留めしないでください - Auth0 はこの手法を推奨していません

パフォーマンス最適化

  • すべての非同期処理で、UI 更新には @MainActor を正しく使用する
  • @Published プロパティで適切なメモリ管理を行う
  • 資格情報をオフラインアクセス用に Keychain に安全にキャッシュする
  • ユーザーのプロファイルは IDトークンから取得し、追加のネットワークリクエストは発生させない