3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【MSAL SwiftUI】MSALでのAuthenticator認証を可能にする

Last updated at Posted at 2023-03-31

公式チュートリアルに沿って
SwiftUIで作ったiOSアプリにMSALを導入し、
AzureADのユーザー名とパスワードでの認証が可能になったが
Authenticatorでの認証が上手くいかなくてハマった時の備忘録

Authenticatorでの認証を許可する設定(許可するだけ)

iPhoneにMicrosoft Authenticatorがインストールされていると
ログイン処理時に自動でAuthenticatorを開き認証できるよう
チュートリアルに沿って下記のようにInfo.plistを設定した

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>msauth.[BUNDLE_ID]</string>
        </array>
    </dict>
</array>
<key>LSApplicationQueriesSchemes</key>
<array>
    <string>msauthv2</string>
    <string>msauthv3</string>
</array>

↓この部分がそれに該当する

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>msauthv2</string>
    <string>msauthv3</string>
</array>

こうするとログイン処理時にAuthenticatorが自動で開きはするが
これだけではあくまでを「Authenticatorを自動で開くように許可しただけ」であり
Authenticator認証のレスポンス」を受け取る処理を別で実装する必要がある

Authenticator認証のレスポンスを受け取る実装

レスポンスを受け取るには、AppDelegateSceneDelegateを実装する

// AppDelegate.swift
import UIKit

class AppDelegate: UIResponder, UIApplicationDelegate {
    func application(
        _ application: UIApplication,
        configurationForConnecting connectingSceneSession: UISceneSession,
        options: UIScene.ConnectionOptions
    ) -> UISceneConfiguration {

        let config = UISceneConfiguration(name: nil, sessionRole: connectingSceneSession.role)
        config.delegateClass = SceneDelegate.self
        return config
    }
    
    func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil
    ) -> Bool {
        sleep(UInt32(1))
        return true
    }
}
// SceneDelegate.swift
import UIKit
import MSAL

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
        guard let urlContext = URLContexts.first else { return }
        
        let url = urlContext.url
        let sourceApp = urlContext.options.sourceApplication
        
        MSALPublicClientApplication.handleMSALResponse( url, sourceApplication: sourceApp)
    }
}

そして、SwiftUIでAppDelegateを読み込めるようにApp.swiftを実装する

// HogeApp.swift
import SwiftUI

@main
struct HogeApp: App {
    @UIApplicationDelegateAdaptor (AppDelegate.self) var appDelegate
    
    var body: some Scene {
        WindowGroup {
            ContentView(viewModel: .init())
        }
    }
}

@UIApplicationDelegateAdaptor
UIKitのDelegateをSwiftUIで使用するためのプロパティラッパー。
アプリのデリゲートが@UIApplicationDelegateAdaptorに準拠している場合
SwiftUIは作成したデリゲートをプロパティ ラッパーを使用して
アプリの任意のSceneまたはViewからデリゲートにアクセス可能になる。

@UIApplicationDelegateAdaptor (AppDelegate.self) var appDelegate

このように実装することで
デバイスにMicrosoft Authenticatorがインストールされていれば
ログイン処理時に自動でAuthenticatorを開き
そのレスポンスをアプリが受け取り、認証できるようになる

※ご参考

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?