2017-03-22 33 views
1

我開發有(直到現在)一個科爾多瓦的應用程序使用的密碼贈款,以獲取來自微軟的標準的OAuth提供JWTs天青:使用JWT OAuth的Azure的MFA科爾多瓦應用2.0令牌

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

它的工作原理精細。但是,我們正在向外部交易商開放我們的申請,並且所有者希望添加MFA。

因此,我在Azure中創建了一個MFA提供程序,我已爲MFA啓用了一個測試帳戶。

我目前使用InAppBrowser插件打開重定向請求 - 這似乎工作 - 它打開登錄頁面,它的文本,我把代碼放入,然後它完成登錄到「應用程序」初始屏幕(用戶的默認Azure登錄)。

我的問題是確定登錄成功,並檢索JWT。由於MFA的,登錄服務器都將返回初始登錄下面的「MFA」的錯誤(不是一個真正的錯誤):

interaction_required 

然而,一旦MFA完成後,我不知道去哪裏得到我的令牌/刷新令牌。如果我重新提交登錄信息,即使在MFA過程中選擇了「不再詢問[X]天」,它也會發送一條「interact_required」消息。

我希望問題清楚。如果沒有,請告訴我,我會根據需要進行修改。

我目前沒有使用ADAL或任何cordova插件進行身份驗證。我自己打了端點。答案可能是我必須使用ADAL。

+0

我認爲這個問題源於InAppBrowser不與我的應用程序共享localStorage。一旦InAppBrowser關閉,其Cookie將超出範圍並被銷燬。至少目前的研究正在引領我。我將不得不弄清楚如何通過XMLHttpRequest(或ADAL或其他)直接與MFA提供者交談。 – Aaron

回答

1

好吧,這是問題。由於我使用的是密碼授權,因此我沒有訪問/ oauth2/authorize端點 - 它不需要密碼授權 - 您直接訪問/ oauth2/token ...

使用MFA時,必須使用/ oauth2/authorize。如果啓用了MFA,它將重定向併爲您處理所有事情(非常簡單)。您只需等待您的重定向url,auth代碼就是一個查詢參數,因此非常容易推斷。

瀏覽器重定向後,你搶的授權碼,然後將其提交到/的oauth2 /令牌服務器,沒有用戶名/密碼(Authorization頭也並不是必需的,因爲你沒有給哪個好要求兩次 - 一次用於MFA,一次用於傳遞/令牌 - 稱呼微軟)。

流量

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 /令牌服務器,並接收返回您的令牌(我正在密碼授予的東西留下評論,爲未來的讀者,在密碼授予開始):

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

就是這樣。希望有一天能幫助別人。