2017-03-22 31 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); 

就是这样。希望有一天能帮助别人。