Azure的MFA科尔多瓦的应用程序,使用智威汤逊的OAuth 2.0令牌(Azure MFA in

2019-09-27 11:11发布

我正在开发具有(直到现在)一个科尔多瓦的应用程序使用的密码赠款,以获取来自微软的标准的OAuth提供JWTs在Azure中:

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

它工作正常。 然而,我们开放我们的交易商以外的应用程序,车主希望MFA增加。

所以,我已经创建了Azure中MFA提供商,我已经启用MFA测试帐户。

这似乎工作 - - 我使用InAppBrowser插件目前开放重定向请求,它会打开登录页面,它的文本,我把代码,然后把它完成登录到“应用程序”闪屏(默认天青登录用户)。

我的问题是标识登录成功,并取回JWTs。 由于MFA的,登录服务器都将返回初始登录下面的“MFA”的错误(不是一个真正的错误):

interaction_required

然而,一旦MFA完成后,我不知道去哪里得到我的令牌/刷新令牌。 如果我重新提交的登录,它只是发回一个“interaction_required”消息,即使“不要再问问[X]天”在MFA过程中被选中。

我希望这个问题是清楚的。 让我知道,如果没有,我会在必要时修改。

我不是目前使用ADAL或认证的任何科尔多瓦插件。 我打我自己的端点。 答案可能是,我不得不使用ADAL。

Answer 1:

玉家伙,这里的问题。 由于我使用的密码补助金,我不打/的oauth2 /授权终点 - 它不是与口令授予必需的 - 你直接去/的oauth2 /令牌...

随着MFA,/的oauth2 /授权是强制性的。 如果MFA已启用,将其重定向并为您处理一切(很简单)。 您只需等待你的重定向URL,该授权码是查询参数,因而很容易推断。

将浏览器重定向后,你抢的授权码,然后将其提交到/的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);

而已。 希望它可以帮助别人的一天。



文章来源: Azure MFA in Cordova app that uses JWT OAuth 2.0 tokens