---
title: ASWebAuthenticationSession
description: ASWebAuthenticationSessionを使用してiOSでカード非提示認証キャプチャ体験を実装する方法:認証コントローラー、セッションの設定、必要な権限。
canonical: https://developer.unico.io/ja/dual-api/developers/regional-solutions/card-not-present-verification/integration/controlling-the-experience/mobile/ios/aswebauthenticationsession
locale: ja
generated_by: markdown-export
---

iOSの利用では、ASWebAuthenticationSessionの使用が推奨されるアプローチの1つです。

取引を作成し、取引リンクを取得した後は、以下の実装をお勧めします。

- 通常のフロー(カード非提示認証を含む)の中で、APIを通じて生成されたリンクでASWebAuthenticationSessionを開きます。
- アプリケーションに最適な方法で、この開き方をカスタマイズできます。
- URLが変更されたかどうか(`redirectUrl`への変更)を監視し、変更があればページを閉じます。

フローを機能させるには、以下の手順に従う必要があります。

### ステップ1:支払い認証コントローラーを作成する

最初のステップは、支払い認証コントローラーを作成することです。そのためには、`IDPayAuthenticationController`(または任意の名前)というクラスを作成します。

次に、クラスの先頭で`AuthenticationServices`フレームワークをインポートします。

クラスを`NSObject`として宣言し、`ASWebAuthenticationPresentationContextProviding`プロトコルを実装します。

結果は以下のようになります。

```swift
import AuthenticationServices

class IDPayAuthenticationController: NSObject, ASWebAuthenticationPresentationContextProviding {
    func presentationAnchor(for session: ASWebAuthenticationSession) -> ASPresentationAnchor {
           if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene {
               if let mainWindow = windowScene.windows.first {
                   return mainWindow
               }
           }
           return ASPresentationAnchor()
       }
}
```

### ステップ2:認証を実装する

認証を実行するファイルを開き、必要なインポートを追加します(この例では`ContentView.swift`で行っています)。

```swift
import SwiftUI
import AuthenticationServices
```

認証状態を制御するために、`@State`プロパティを作成します。

```swift
@State private var isAuthenticated = false
```

`ContentView`構造体の本体の外側に、`IDPayAuthenticationController`クラスのインスタンスを作成します。

```swift
let idPayController = IDPayAuthenticationController()
```

支払いを検証するために、`authenticatePayment`という関数を作成します。

```swift
func authenticatePayment() {
    guard let url = URL(string: "URL_AUTHENTICATION") else { return }

    var session: ASWebAuthenticationSession?
    session = ASWebAuthenticationSession(url: url, callbackURLScheme: "BUNDLE") { callbackURL, error in
        guard callbackURL != nil else {
            if let error = error {
                return print("Error during authentication: \(error.localizedDescription)")
            }
            return
        }

        // コールバックURLを処理し、認証が成功したかどうかを確認する
        session?.cancel()
        isAuthenticated = true
    }

    session?.presentationContextProvider = idPayController
    session?.prefersEphemeralWebBrowserSession = true
    session?.start()
}
```

:::danger
URL`URL_AUTHENTICATION`を、お客様の取引で受け取った認証URLに変更することを忘れないでください。同様に、`callbackURLScheme`の`BUNDLE`も、取引作成時に提供されたリダイレクト先に変更してください(アプリのBundle Identifierを使用することをお勧めします)。
:::

:::note
取引ごとに一意の認証を保証するため、`prefersEphemeralWebBrowserSession`を`true`に設定することが重要です。
:::

:::note
正しく機能するためには、以下の権限が必要です。
- カメラ
- 位置情報
:::

詳細については、公式の[ASWebAuthenticationSessionドキュメント](https://developer.apple.com/documentation/authenticationservices/aswebauthenticationsession)を参照することをお勧めします。