首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ADAL.JS与移动应用程序

ADAL.JS与移动应用程序
EN

Stack Overflow用户
提问于 2017-03-14 20:44:22
回答 2查看 2.3K关注 0票数 1

我正在尝试将一些Oracle交付的移动应用程序(MAF)移动应用程序与Azure AD身份验证相结合。我已经尝试了Java方法,这显然是在我的情况下行不通

因此,我决定尝试使用ADAL.JS的Javascript登录页面选项,因为MAF通过转换到HTML5/Javascript/Cordova来创建跨平台兼容的代码,所以我认为我可以让JS选项工作,而不需要使用多个特定的SDK解决方案,比如Android或ADAL.JS。因为我可以将其全部包装在HTML页面中,所以我可以使用ADAL.JS所需的OAUTH隐式流选项。我让ADAL.JS部件在我的PC上使用带有本地Node/Webpack开发服务器的这个例子为重定向URI工作。(注意,就像那个例子一样,我更喜欢使用严格的adal.js选项,避免使用任何角-js之类的东西)。然而,当部署在Android移动设备上时,我遇到了一个问题。这似乎是由于答复URI。在提示输入Azure凭据并提供这些凭据后,将产生以下错误。

Reply address 'file:///data/user/0/com.company.app/storage/assets/FARs/ViewController/public_html/SignOn/login.html‘有一个无效的方案。

我发现,当部署到移动设备时,Azure注册的应用程序必须设置为输入“本机”,而不是"Web/API“,我已经这样做了。根据一个MSFT示例(因为我没有足够的代表来包含两个以上的链接),重定向URI必须设置为"https://login.microsoftonline.com/common/oauth2/nativeclient“。但我还是会犯同样的错误。

自@FeiXue Reply以来的更新

我使用的是原始端点,而不是2.0。当我将redirectURI设置为这样时:

redirectURI=https://login.microsoftonline.com/common/oauth2/nativeclient

浏览器在地址栏中返回此内容,并保持在空白屏幕上,并且不发出令牌。它在PC浏览器和移动浏览器上都这样做。

http://login.microsoftonline.com/common/oauth2/nativeclient#id_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6ImEzUU4wQlpTN3M0bk4tQmRyamJGMFlfTGRNTSIsImtpZCI6ImEzUU4wQlpTN3M0bk4tQmRyamJGMFlfTGRNTSJ9.(shortened for brevity)&state=e1ce94fb-6310-4dec-9e8b-053727ceb9b8&session_state=1beafa4d-af55-415b-85d5-83e8b4035594

但是,对于完全相同的代码,在PC上设置redirectURI时,它返回一个访问令牌:

redirectURI=https://localhost:8443 <-端口到本地节点服务器

我也尝试过使用urn:ietf:wg:oauth:2.0:oob的redirectURI,但这也不起作用。

代码语言:javascript
复制
<!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()工作并返回一个有效的令牌。

但是当http://login.microsoftonline.com/common/oauth2/nativeclient#id_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1Ni......的redirectURI="https://login.microsoftonline.com/common/oauth2/nativeclient“不再重定向时

虽然它显示了id_token,但它从不重定向回我的index.html,因此我不能调用authContext.acquireToken()将它传递到我的web。

EN

回答 2

Stack Overflow用户

发布于 2017-03-24 15:26:22

从我对这个主题的研究来看,这里是关于ADAL.JS和本地(移动)设备支持的要点。

正如@fei msft所提到的,ADAL.JS并不是针对本地/移动设备的,也不适用于移动设备。编写ADAL.JS时考虑的是“原始”Azure端点,而不是为移动/本机设备提供更多功能的v2.0端点(请参阅下面关于两个不同端点选项的更多信息)。不过,您可以尝试使用一个实验ADAL.JS分支 (使用v2.0端点),但是它不再被主动更新,所以您可以自己进行更新。新的MSFT方法是使用新的MSAL库,它是针对v2.0端点编写的。然而,目前还没有MSAL库,但是有传言说在某个时候会有一个库。有关两个不同的Azure端点(“原始”与“v2.0”)的更多信息,请参见下面的链接。在我的故障排除过程中,对这方面的困惑是一种挫折,所以我帮助帮助其他一些人沿着这条轨道前进。

因此,如果您希望在移动设备上获得Azure Oauth身份验证,首先决定要使用哪个Azure Endpoint (支持下面的链接,如v2.0确实有一些最初端点没有的限制)。您可以通过查看下面列出的元数据文档链接来确定您的租户的特定端点,只需替换您的租户名称或ID即可。

要为特定类型的端点(原始的还是v2.0)注册应用程序,请使用下面引用的适当的appropriate链接。然后,要确定为本机/移动设备创建Azure auth解决方案的选项,请参阅每个端点版本的代码示例,并确保该示例用于“本机”,否则它可能无法在移动设备上工作。例如,您将不会看到原始端点库选项的ADAL.JS示例,但是您将看到一个用于Cordova的示例(这就是为什么@fei msft建议采用这种方法的原因)。对于v2.0端点示例,您将看到MSAL/Xamarin选项,对于Javascript选项,您可以尝试类似于Hello.JS样品的选项。

原始端点

https://login.microsoft.com/{租户id}/OAuth2/授权

应用程序注册门户: https://portal.azure.com 代码示例: https://learn.microsoft.com/en-us/azure/active-directory/develop/active-directory-code-samples#native-application-to-web-api 原生Auth场景: https://learn.microsoft.com/en-us/azure/active-directory/develop/active-directory-authentication-scenarios#native-application-to-web-api OpenID元数据文档: https://login.microsoft.com/{tenant id}/.知名/openid-配置

V2.0端点

https://login.microsoftonline.com/{租户id}/OAuth2/v2.0/授权

应用程序注册门户: https://apps.dev.microsoft.com V2.0端点比较: https://learn.microsoft.com/en-us/azure/active-directory/develop/active-directory-v2-compare 代码示例: https://learn.microsoft.com/en-us/azure/active-directory/develop/active-directory-v2-libraries OpenID元数据文档:https://login.microsoft.com/{openid}/v2.0/.众所周知/openid-配置

票数 2
EN

Stack Overflow用户

发布于 2017-03-15 09:59:07

您正在使用Azure ADV2.0端点进行开发吗?

如果不是,我们可以根据需要在本地应用程序的门户上配置重定向URI。但是,由于错误消息表明文件协议不是验证方案。

在这个场景中,我们可以使用http或https,因为您是用HTML开发的。

在AzureADV2.0端点中,我们目前无法为本地应用程序设置redirect_Uri。我们可以使用urn:ietf:wg:oauth:2.0:oobhttps://login.microsoftonline.com/common/oauth2/nativeclient作为redirect_Uri。第一个是用于设备的本机应用程序,第二个是用于浏览器中宿主的客户端(web视图)。

最后,请确保请求中的redirect_uri使用的是为门户注册的正确的。还可以在浏览器上测试请求,以缩小此问题是否是导致请求中的不正确redirect_uri的原因。对于授权请求,您可以参考下面的链接:

授权使用OAuth 2.0和Azure Active访问web应用程序

v2.0协议- OAuth 2.0授权代码流

Update(如果打开导致弹出页未关闭的磁盘HTML,则不存在href属性)

代码语言:javascript
复制
AuthenticationContext.prototype._loginPopup = function (urlNavigate) {
        var popupWindow = this._openPopup(urlNavigate, "login", this.CONSTANTS.POPUP_WIDTH, this.CONSTANTS.POPUP_HEIGHT);
        if (popupWindow == null) {
            this.warn('Popup Window is null. This can happen if you are using IE');
            this._saveItem(this.CONSTANTS.STORAGE.ERROR, 'Error opening popup');
            this._saveItem(this.CONSTANTS.STORAGE.ERROR_DESCRIPTION, 'Popup Window is null. This can happen if you are using IE');
            this._saveItem(this.CONSTANTS.STORAGE.LOGIN_ERROR, 'Popup Window is null. This can happen if you are using IE');
            if (this.callback)
                this.callback(this._getItem(this.CONSTANTS.STORAGE.LOGIN_ERROR), null, this._getItem(this.CONSTANTS.STORAGE.ERROR));
            return;
        }
        if (this.config.redirectUri.indexOf('#') != -1)
            var registeredRedirectUri = this.config.redirectUri.split("#")[0];
        else
            var registeredRedirectUri = this.config.redirectUri;
        var that = this;
        var pollTimer = window.setInterval(function () {
            if (!popupWindow || popupWindow.closed || popupWindow.closed === undefined) {
                that._loginInProgress = false;
                window.clearInterval(pollTimer);
            }
            try {
                //there is no href property if open the HTML from disk
                if (popupWindow.location.href.indexOf(registeredRedirectUri) != -1) {
                    if (that.isAngular) {
                        that._onPopUpHashChanged(popupWindow.location.hash);
                    }
                    else {
                        that.handleWindowCallback(popupWindow.location.hash);
                    }
                    window.clearInterval(pollTimer);
                    that._loginInProgress = false;
                    that.info("Closing popup window");
                    popupWindow.close();
                }
            } catch (e) {
            }
        }, 20);
    };

造成此问题的原因是,当我们从设备(磁盘)打开HTML页面时,父HTML页面(登录页)无法获得弹出页面的位置。因此,父页无法根据弹出页的位置关闭该页。为了解决这个问题,我建议您使用azure-activedirectory-库-for-cordova进行开发,或者在web的后端托管登录页面。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42796213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档