2

我正在开发一个 Cordova 应用程序,该应用程序(直到现在)使用密码授权从 Azure 中的 Microsoft 标准 OAuth 提供程序检索 JWT:

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

它工作正常。但是,我们正在向外部交易者开放我们的应用程序,并且所有者希望添加 MFA。

因此,我在 Azure 中创建了一个 MFA 提供程序,并为 MFA 启用了一个测试帐户。

我目前正在使用 InAppBrowser 插件打开重定向请求 - 这似乎工作 - 它打开登录页面,它发短信,我输入代码,然后它完成登录到“应用程序”启动屏幕(默认 Azure 登录用户)。

我的问题是确定登录成功,并检索 JWT。由于 MFA,登录服务器现在在初始登录时返回以下“MFA”错误(不是真正的错误):

interaction_required

但是,一旦 MFA 完成,我不知道去哪里获取我的令牌/刷新令牌。如果我重新提交登录,它只会发回一条“interaction_required”消息,即使在 MFA 过程中选择了“Do Not Again For [X] Days”。

我希望这个问题很清楚。如果没有,请告诉我,我会根据需要进行修改。

我目前没有使用 ADAL 或任何 cordova 插件进行身份验证。我自己达到了终点。答案可能是我必须使用 ADAL。

4

1 回答 1

2

好的,伙计们,问题来了。因为我使用的是密码授权,所以我没有点击 /oauth2/authorize 端点——密码授权不需要它——你直接去 /oauth2/token...

对于 MFA,/oauth2/authorize 是强制性的。如果启用了 MFA,它会为您重定向和处理所有内容(非常简单)。您只需等待您的重定向 url,身份验证代码是一个查询参数,因此很容易推断。

浏览器重定向后,您获取授权码,然后将其提交到 /oauth2/token 服务器,无需用户名/密码(也不需要授权标头,这很好,因为您不必要求两次 - 一次对于 MFA,并且一次传递给 /token - 好打电话给微软)。

流动

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/token 服务器,并接收回您的令牌(我将在密码授予中留下评论,以供将来从密码授予开始的读者使用):

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

就是这样。希望有一天它可以帮助某人。

于 2017-03-24T15:48:41.987 回答