在Durandal单页面应用程序中使用OAuth2进行身份验证

时间:2016-03-31 17:13:07

标签: knockout.js oauth oauth-2.0 requirejs durandal

我有一个使用Durandal的单页应用程序。在其中一个页面上,我需要使用OAuth 2进行身份验证,以获取用于调用Web服务的令牌。我不想放弃我的单页应用程序状态,所以我想在新窗口中执行OAuth授权。

我现在遇到的未解决的问题是将OAuth令牌从子窗口传递给父窗口。我试图找到一种方法将令牌从子窗口放到父窗口中的Durandal应用程序,但我还没有找到任何解决方案。最后我决定将它放在父窗口的属性中,但它仍然不起作用。

这是我的模块代码:

activate: function () {
    var authTokenDeffered = $.Deferred();

    if (!window.myAuthToken) {
        var authWindow = window.open(
            "https://oauth.myprovider.com/authorize?response_type=token&client_id=98599205d0aa4837a074cc19163bd38e&display=popup",
            "_blank", "modal=yes,alwaysRaised=yes");

        var checkConnect = setInterval(function () {
            if (!authWindow || !authWindow.closed) return;
            clearInterval(checkConnect);

            // I expect token here, but I do not get it
            console.log(window.myAuthToken); 

            authTokenDeffered.resolve(window.myAuthToken);
        }, 100);
    } else {
        authTokenDeffered.resolve(window.myAuthToken)
    }

    var campaigns = this.campaigns;
    return authTokenDeffered.then(function (authToken) {
        http.get('https://myprovider.com/my-service', {}, {'Authorization': 'Bearer ' + authToken})
            .then(function (response) { campaigns(response); });
    });
},

OAuth 2回调页面包含以下脚本:

var token = /access_token=([0-9a-f]+)/.exec(document.location.hash)[1];
window.parent.myAuthToken = token;
window.close();

1 个答案:

答案 0 :(得分:0)

将数据传递给父级的正确方法是

window.opener.myAuthToken = token;