我正在开发具有(直到现在)一个科尔多瓦的应用程序使用的密码赠款,以获取来自微软的标准的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。
玉家伙,这里的问题。 由于我使用的密码补助金,我不打/的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);
而已。 希望它可以帮助别人的一天。