使用 JWT OAuth 2.0 令牌的 Cordova 应用程序中的 Azure MFA
Azure MFA in Cordova app that uses JWT OAuth 2.0 tokens
我正在开发一个 Cordova 应用程序,它(直到现在)使用密码授权从 Azure 中的 Microsoft 标准 OAuth 提供程序检索 JWT:
https://login.microsoftonline.com/[tenant]/oauth2/token
它工作正常。但是,我们正在向外部交易者开放我们的应用程序,并且所有者希望添加 MFA。
所以,我在 Azure 中创建了一个 MFA 提供程序,我已经为 MFA 启用了一个测试帐户。
我目前正在使用 InAppBrowser 插件打开重定向请求 - 这似乎有效 - 它会打开登录页面,发短信,我输入代码,然后完成登录 "Applications"初始屏幕(用户的默认 Azure 登录)。
我的问题是确定登录成功并检索 JWT。由于 MFA,登录服务器现在 returns 初始登录时出现以下 "MFA" 错误(不是真正的错误):
interaction_required
然而,一旦 MFA 完成,我不知道去哪里获取我的 token/refresh 令牌。如果我重新提交登录,它只会发回一条 "interaction_required" 消息,即使在 MFA 过程中选择了 "Do Not Ask Again For [X] Days"。
我希望问题很清楚。如果没有,请告诉我,我会根据需要进行修改。
我目前没有使用 ADAL 或任何 cordova 插件进行身份验证。我自己达到了终点。答案可能是我必须使用ADAL。
好的,伙计们,问题来了。因为我使用的是密码授权,所以我没有点击 /oauth2/authorize 端点——密码授权不需要它——你直接去 /oauth2/token...
对于 MFA,/oauth2/authorize 是强制性的。如果启用了 MFA,它会为您重定向并处理一切(非常简单)。您只需等待您的重定向 url,授权码是一个查询参数,因此很容易推断。
浏览器重定向后,你抓取授权码,然后提交给/oauth2/token服务器,没有 username/password(Authorization header也没有必需的,这很好,因为您不必两次请求它 - 一次用于 MFA,一次传递给 /token - 很好地调用 Microsoft)。
流量
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);
就是这样。希望有一天能对某人有所帮助。
我正在开发一个 Cordova 应用程序,它(直到现在)使用密码授权从 Azure 中的 Microsoft 标准 OAuth 提供程序检索 JWT:
https://login.microsoftonline.com/[tenant]/oauth2/token
它工作正常。但是,我们正在向外部交易者开放我们的应用程序,并且所有者希望添加 MFA。
所以,我在 Azure 中创建了一个 MFA 提供程序,我已经为 MFA 启用了一个测试帐户。
我目前正在使用 InAppBrowser 插件打开重定向请求 - 这似乎有效 - 它会打开登录页面,发短信,我输入代码,然后完成登录 "Applications"初始屏幕(用户的默认 Azure 登录)。
我的问题是确定登录成功并检索 JWT。由于 MFA,登录服务器现在 returns 初始登录时出现以下 "MFA" 错误(不是真正的错误):
interaction_required
然而,一旦 MFA 完成,我不知道去哪里获取我的 token/refresh 令牌。如果我重新提交登录,它只会发回一条 "interaction_required" 消息,即使在 MFA 过程中选择了 "Do Not Ask Again For [X] Days"。
我希望问题很清楚。如果没有,请告诉我,我会根据需要进行修改。
我目前没有使用 ADAL 或任何 cordova 插件进行身份验证。我自己达到了终点。答案可能是我必须使用ADAL。
好的,伙计们,问题来了。因为我使用的是密码授权,所以我没有点击 /oauth2/authorize 端点——密码授权不需要它——你直接去 /oauth2/token...
对于 MFA,/oauth2/authorize 是强制性的。如果启用了 MFA,它会为您重定向并处理一切(非常简单)。您只需等待您的重定向 url,授权码是一个查询参数,因此很容易推断。
浏览器重定向后,你抓取授权码,然后提交给/oauth2/token服务器,没有 username/password(Authorization header也没有必需的,这很好,因为您不必两次请求它 - 一次用于 MFA,一次传递给 /token - 很好地调用 Microsoft)。
流量
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);
就是这样。希望有一天能对某人有所帮助。