我有一个使用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();
答案 0 :(得分:0)
将数据传递给父级的正确方法是
window.opener.myAuthToken = token;