Приложение 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);

Вот и все. Надеюсь, это поможет кому-нибудь когда-нибудь.

Другие вопросы по тегам