2017-03-22 2 views
1

Ich entwickle eine Cordova App, die (bis jetzt) ​​verwenden ein Passwort Erteilung abrufen JWTs von der Microsoft-Standard OAuth-Anbietern in Azure:Azure MFA in Cordova App, die JWT OAuth 2.0 verwendet Token

https://login.microsoftonline.com/[tenant]/oauth2/token 

Es funktioniert fein. Wir öffnen jedoch unsere Anwendung für externe Händler, und der Eigentümer möchte, dass MFA hinzugefügt wird.

Also, ich habe einen MFA-Anbieter in Azure erstellt, ich habe ein Testkonto für MFA aktiviert.

Ich öffne gerade die Redirect-Anfrage mit dem InAppBrowser-Plugin - das scheint zu funktionieren - es öffnet sich auf die Login-Seite, es Texte, ich lege den Code ein, und dann vervollständigt die Anmeldung auf dem "Anwendungen" Splash-Bildschirm (Standard-Azure-Anmeldung für Benutzer).

Mein Problem identifiziert, dass Login erfolgreich war, und Abrufen von JWTs. Wegen der MFA, jetzt der Anmelde-Server die folgende „MFA“ Fehler auf Erstanmeldung (nicht wirklich ein Fehler) zurückgibt:

interaction_required 

Sobald jedoch MFA abgeschlossen ist, habe ich keine Ahnung, wohin sie gehen, um meine Token/Aktualisierungstoken. Wenn ich die Anmeldung erneut absende, wird nur eine "interaction_required" -Nachricht zurückgesendet, auch wenn "Während des MFA-Prozesses nicht erneut nach [X] Tagen fragen" ausgewählt ist.

Ich hoffe, das Problem ist klar. Lass es mich wissen, wenn nicht und ich werde es bei Bedarf überarbeiten.

Ich verwende derzeit keine ADAL oder Cordova Plugins zur Authentifizierung. Ich treffe die Endpunkte alleine. Die Antwort könnte sein, dass ich ADAL benutzen muss.

+0

Ich glaube, dass das Problem von der Tatsache herrührt, dass InAppBrowser localStorage nicht mit meiner App teilt.Sobald InAppBrowser geschlossen wird, gehen seine Cookies außer Reichweite und werden zerstört. Zumindest führt mich die aktuelle Forschung an. Ich werde herausfinden müssen, wie ich direkt mit dem MFA-Provider über eine XMLHttpRequest (oder ADAL oder so etwas) sprechen kann. – Aaron

Antwort

1

Ok Jungs, hier ist das Problem. Da ich Password Grants verwendet habe, traf ich nicht den/oauth2/authorize Endpoint - es ist nicht erforderlich mit Passwort gewährt - Sie gehen direkt zu/oauth2/token ...

Mit MFA,/oauth2/authorize ist obligatorisch. Wenn MFA aktiviert ist, leitet es alles um und handhabt alles (sehr einfach). Sie warten einfach auf Ihre Weiterleitungs-URL, der Authentifizierungscode ist ein Abfrageparameter und ist daher sehr einfach zu extrapolieren.

Nachdem der Browser umleitet, greifen Sie den Autorisierungscode, und legt sie dann in das Verzeichnis/oauth2/Token-Server, ohne Benutzername/Passwort (Authorization-Header erforderlich auch nicht, was gut ist, weil Sie nicht zu tun haben, frage zweimal danach - einmal nach MFA, und einmal nach/token - guter Ruf Microsoft).

Fluss

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); 
    } 
} 

}

Dann in '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(); 
    } 

Sie dann den Berechtigungscode übergeben, in dem/oauth2/Token-Server und erhalten zurück Ihr Token (Ich verlasse mich in Passwort Grant Sachen kommentiert, für zukünftige Leser, die mit einem Passwort Grant) begann:

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); 

Das ist es. Hoffe es hilft jemandem eines Tages.

Verwandte Themen