公式チュートリアルに沿って
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認証のレスポンスを受け取る実装
レスポンスを受け取るには、AppDelegate
とSceneDelegate
を実装する
// 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を開き
そのレスポンスをアプリが受け取り、認証できるようになる
※ご参考