Sam Stone
01/12/2024, 4:04 AMSam Stone
01/12/2024, 4:07 AMexpect class MSALAuthManager {
suspend fun getAuthToken(request: MSALRequest): MSALResponse
}
data class MSALRequest(
val scopes: List<String>,
val clientId: String,
val context: Any? = null, //UIViewController, android.Context, etc.
val redirectUri: String? = null,
)
data class MSALResponse(
val accessToken: String? = null,
val accountIdentifier: String? = null,
val error: String? = null,
)
main.ios.kt:
internal var viewController: UIViewController? = null
fun MainViewController(): UIViewController {
viewController = ComposeUIViewController {
App { msalRequest ->
MSALAuthManager().getAuthToken(msalRequest.copy(context = viewController))
}
}
return viewController!!
}
Swift code:
class Coordinator {
var accessToken: String?
func getAuth(for viewController: UIViewController, completion: @escaping () -> Void) {
let config = MSALPublicClientApplicationConfig(clientId: "<your-client-id-here>")
let scopes = ["User.Read"]
do {
let application = try MSALPublicClientApplication(configuration: config)
let webviewParameters = MSALWebviewParameters(authPresentationViewController: viewController)
let interactiveParameters = MSALInteractiveTokenParameters(scopes: scopes, webviewParameters: webviewParameters)
application.acquireToken(with: interactiveParameters) { [weak self] (result, error) in
guard let authResult = result else {
print("Could not acquire token: \(error?.localizedDescription ?? "No error information available")")
completion()
return
}
print("Auth result: \(authResult)")
self?.accessToken = authResult.accessToken
completion()
}
} catch {
print("Unable to create application: \(error.localizedDescription)")
}
}
}
@objc
class AuthBridge: NSObject {
@objc static func getAuthToken(with viewController: UIViewController, completion: @escaping (String?) -> Void) {
let coordinator = Coordinator()
coordinator.getAuth(for: viewController) {
completion(coordinator.accessToken)
}
}
}
Sam Stone
01/12/2024, 4:10 AMAuthBridge
nor Coordinator
are not appearing the Kotlin side (Android Studio autocomplete). In the build.gradle.kts
file. Created this .def file:
language = Objective-C
headers = "MSALAuth.h"
compilerOpts = "-framework Foundation"
but it didn’t help.