Код: Выделить всё
func signIn(completion: @escaping (Result) -> Void) {
guard let applicationContext = applicationContext else { return }
guard let rootVC = UIApplication.shared.windows.first?.rootViewController else {
completion(.failure(NSError(domain: "MSAL", code: -2, userInfo: [NSLocalizedDescriptionKey: "No rootViewController"])))
return
}
let webViewParameters = MSALWebviewParameters(authPresentationViewController: rootVC)
let parameters = MSALInteractiveTokenParameters(scopes: ["user.read"], webviewParameters: webViewParameters)
applicationContext.acquireToken(with: parameters) { result, error in
if let error = error {
completion(.failure(error))
return
}
guard let result = result else {
completion(.failure(NSError(domain: "MSAL", code: -1, userInfo: [NSLocalizedDescriptionKey: "No result"])))
return
}
self.isLoggedWithMSAL = true
if let identifier = result.account.identifier {
CommonService.setMSALAccountIdentifier(identifier: identifier)
}
completion(.success(result))
}
}
< /code>
И это не вызывает проблем
, но позже мне нужно обновить этот токен (например, за 5 минут до истечения срока действия и когда я получил ошибку от API, что мой токен недействителен) - я вызываю < /p>
func getMSALAuthToken(completion: @escaping (String?) -> Void) {
guard let applicationContext = applicationContext else {
SGuardLog.e("MSAL context is not initialized")
completion(nil)
return
}
let parameters = MSALParameters()
parameters.completionBlockQueue = DispatchQueue.main
applicationContext.getCurrentAccount(with: parameters) { currentAccount, _, error in
if let error = error {
SGuardLog.e("Failed to get accounts: \(error)")
completion(nil)
return
}
guard let currentAccount = currentAccount, currentAccount.identifier == CommonService.getMSALAccountIdentifier() else {
SGuardLog.e("No matching account found")
completion(nil)
return
}
let silentParams = MSALSilentTokenParameters(scopes: ["user.read"], account: currentAccount)
applicationContext.acquireTokenSilent(with: silentParams) { result, error in
if let result = result {
completion(result.idToken)
} else {
SGuardLog.e("Silent token refresh failed: \(error?.localizedDescription ?? "Unknown error")")
completion(nil)
}
}
}
}
< /code>
Но в этом случае я получаю тот же токен с истекшим сроком действия (я анализировал его в jwt io и проверил его). Скорее всего, проблема заключается в прицеле, которые я использую. Я обнаружил, что для обновления токена
я предоставил разрешение на его разрешение в конфигурации Azure, добавив его в качестве параметра, но в результате я дал разрешение на него в конфигурации Azure, но в результате я даже не могу войти и получить ошибку. (MSAlerRordomain ошибка -50000.) Какие конкретные области и разрешения должны быть настроены, чтобы иметь возможность обновлять токен для SSO?
Подробнее здесь: https://stackoverflow.com/questions/797 ... resh-token