【发布时间】:2017-08-05 09:24:54
【问题描述】:
我正在尝试将一些 Oracle 交付的移动应用程序框架应用程序 (MAF) 移动应用程序与 Azure AD 身份验证集成。我已经尝试过 Java 方法,显然是 doesn't work in my case。
所以我决定尝试使用 ADAL.JS 的 Javascript 登录页面选项。由于 MAF 通过转译为 HTML 5/Javascript/Cordova 创建了跨平台兼容代码,我认为我可以使 JS 选项工作,而无需借助 ADAL-Android 或 ADAL-IOS 等多个 SDK 特定解决方案。因为我可以将它全部包装在 HTML 页面中,因为我可以使用 ADAL.JS 所需的 OAUTH 隐式流选项。我的 ADAL.JS 部分在我的 PC 上工作,使用 this example 和本地 Node/Webpack 开发服务器作为重定向 URI。 (注意,就像那个例子一样,我更喜欢使用严格的 adal.js 选项并避免使用任何 angular-js 的东西)。但是,我在 Android 移动设备上部署时遇到了问题。这似乎是由于回复 URI。在提示输入 Azure 凭据并提供这些凭据后,会产生以下错误。
AADSTS50011:回复地址“file:///data/user/0/com.company.app/storage/assets/FARs/ViewController/public_html/SignOn/login.html”的方案无效。
我发现在部署到移动设备时,Azure 注册的应用程序必须设置为键入“Native”而不是我所做的“Web/API”。并且根据一个 MSFT 示例(我不能包含该示例,因为我没有足够的代表来包含两个以上的链接)重定向 URI 必须设置为“https://login.microsoftonline.com/common/oauth2/nativeclient”。但我仍然得到同样的错误。
@FeiXue 回复后更新
我使用的是原始端点而不是 2.0。当我这样设置redirectURI时:
redirectURI=https://login.microsoftonline.com/common/oauth2/nativeclient
浏览器在地址栏中返回此信息,并保持在空白屏幕上,并且不发出令牌。它在 PC 浏览器和移动浏览器上都执行此操作。
http://login.microsoftonline.com/common/oauth2/nativeclient#的 id_token 强> = eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6ImEzUU4wQlpTN3M0bk4tQmRyamJGMFlfTGRNTSIsImtpZCI6ImEzUU4wQlpTN3M0bk4tQmRyamJGMFlfTGRNTSJ9。(缩短为了简洁)状态= e1ce94fb-6310-4dec-9e8b-053727ceb9b8&session_state = 1beafa4d-af55-415b-85d5-83e8b4035594 P>
但是,对于完全相同的代码,当我在 PC 上设置 redirectURI 时,它会返回一个访问令牌:
redirectURI=https://localhost:8443
我也尝试过使用 urn:ietf:wg:oauth:2.0:oob 的 redirectURI,但这也不起作用。
代码
<!DOCTYPE html>
<html>
<head>
<title>Authenticate User with ADAL JS</title>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="https://secure.aadcdn.microsoftonline-p.com/lib/1.0.0/js/adal.js"></script>
<script type="text/javascript">
$(document).ready(function() {
"use strict";
var variables = {
azureAD: "mytenant.onmicrosoft.com",
clientId: "cc8ed7e0-56e9-45c9-b01e-xxxxxxxxxx"
}
window.config = {
tenant: variables.azureAD,
clientId: variables.clientId,
postLogoutRedirectUri: window.location.origin,
redirectUri: "https://login.microsoftonline.com/common/oauth2/nativeclient",
endpoints: {
aisApiUri: "cc8ed7e0-56e9-45c9-b01e-xxxxxxxxxx"
}
//cacheLocation: "localStorage"
};
var authContext = new AuthenticationContext(config);
var isCallback = authContext.isCallback(window.location.hash);
authContext.handleWindowCallback();
if (isCallback && !authContext.getLoginError()) {
window.location = authContext._getItem(authContext.CONSTANTS.STORAGE.LOGIN_REQUEST);
}
var user = authContext.getCachedUser();
if (!user) {
authContext.login();
}
authContext.acquireToken(config.endpoints.aisApiUri, function (error, token) {
if (error || !token) {
console.log("ADAL error occurred in acquireToken: " + error);
return;
}
else {
var accessToken = "Authorization:" + " Bearer " + token;
console.log("SUCCESSFULLY FETCHED TOKEN: " + accessToken);
}
});
});
</script>
</head>
<body>
<h1>Test Login</h1>
</body>
</html>
更新
@FeiXue 所以我猜你所说的 id_token 是访问令牌吗?我认为那么问题是这样的。
当 redirectURI="https://localhost:8443" 在 AAD 登录后重定向回我的 index.html 并且 authContext.acquireToken() 工作并返回有效令牌。
但是当 redirectURI="https://login.microsoftonline.com/common/oauth2/nativeclient" 它永远不会从http://login.microsoftonline.com/common/oauth2/nativeclient#重定向回来id_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1Ni......
虽然它显示 id_token,但它永远不会重定向回我的 index.html 所以我无法调用 authContext.acquireToken() 将其传递到我的 Web API。
【问题讨论】:
标签: azure-active-directory adal oracle-maf adal.js