Приложение Azure MFA в Cordova, использующее токены JWT OAuth 2.0
Я разрабатываю приложение Cordova, которое (до сих пор) использовало предоставление пароля для получения JWT от стандартного поставщика OAuth от Microsoft в Azure:
https://login.microsoftonline.com/[tenant]/oauth2/token
Работает нормально. Однако мы открываем наше приложение для сторонних трейдеров, и владелец хочет добавить MFA.
Итак, я создал провайдера MFA в Azure, я включил тестовую учетную запись для MFA.
В настоящее время я открываю запрос на перенаправление с помощью плагина InAppBrowser, который, кажется, работает, открывает страницу входа в систему, отправляет текстовые сообщения, вводит код и завершает вход на экран-заставку "Приложения" (вход по умолчанию в Azure для пользователей).
Моя проблема заключается в определении того, что вход был успешным, и получении JWT. Из-за MFA, сервер входа в систему теперь возвращает следующую ошибку "MFA" при первоначальном входе в систему (на самом деле это не ошибка):
interaction_required
Однако, как только MFA завершен, я понятия не имею, куда пойти, чтобы получить мой токен / обновить токен. Если я повторно отправляю логин, он просто отправляет обратно сообщение "Interaction_required", даже если во время процесса MFA выбрано "Не спрашивать снова [X] дней".
Я надеюсь, что проблема ясна. Дайте мне знать, если нет, и я буду пересматривать по мере необходимости.
В настоящее время я не использую ADAL или какие-либо плагины Cordova для аутентификации. Я бью конечные точки самостоятельно. Ответ может быть, что я должен использовать ADAL.
1 ответ
Хорошо, ребята, вот проблема. Поскольку я использовал предоставление паролей, я не обращался к конечной точке /oauth2/authorize - это не требуется для предоставления паролей - вы переходите прямо к /oauth2/token...
При использовании MFA /oauth2/authorize является обязательным. Если MFA включен, он перенаправляет и обрабатывает все для вас (очень просто). Вы просто ожидаете свой URL перенаправления, код авторизации является параметром запроса, и поэтому его очень легко экстраполировать.
После перенаправления браузера вы берете код авторизации и затем отправляете его на сервер / oauth2 / token без имени пользователя / пароля (заголовок авторизации также не требуется, что хорошо, потому что вам не нужно запрашивать его дважды - один раз для MFA, и один раз, чтобы перейти в / токен - хороший вызов Microsoft).
поток
testMFA = function () {
var url = "https://login.microsoftonline.com/[tenantID]/oauth2/authorize?client_id=[clientID]&response_type=code&response_mode=query";;
var target = "_blank";
var options = "location=yes";
inAppBrowserRef = cordova.InAppBrowser.open(url, target, options);
with (inAppBrowserRef) {
try {
addEventListener('loadstart', loadStartCallBack);
addEventListener('loadstop', loadStartCallBack);
addEventListener('loaderror', loadStartCallBack);
addEventListener('exit', loadStartCallBack);
}
catch (ex) {
alert(ex);
}
}
}
Затем в "loadStartCallBack":
else if (event.url.split('/')[2] == '[returnURLWithoutHttps://]') {
var fullstring = event.url.split('/')[3].split('?code=')[1]
var code = fullstring.split('&')[0];
var sess_state = fullstring.split('session_state=')[1];
localStorage.tokenCode = code;
sessionStorage.sess_state = sess_state;
inAppBrowserRef.close();
getToken();
}
Затем вы передаете код авторизации на сервер / oauth2 / token и получаете обратно свой токен (я оставляю комментарий в комментариях по предоставлению пароля для будущих читателей, которые начали с предоставления пароля):
var data =
'resource=[resourceURL]' +
//'&username=' + window.sessionStorage.loginUser +
//'&password=' + password +
'&client_id=' + clientId +
'&code=' + authCode +
'&grant_type=authorization_code' +
//'&grant_type=password';
'&response_type=token';
var dataFinal = encodeURI(data);
Вот и все. Надеюсь, это поможет кому-нибудь когда-нибудь.