我正在尝试将accounts-facebook
与Ionic CLI
一起使用。我使用的是client side bundler script,但我无法完成整个oauth
工作流程。
我从account-facebook
项目设置了标准meteor-angular-socially
配置,发现我遇到了oauth
重定向URI。在我的客户端软件包
// in script: oauth/oauth_client.js
// Called by the popup when the OAuth flow is completed, right before
// the popup closes.
OAuth._handleCredentialSecret = function (credentialToken, secret) {
check(credentialToken, String);
check(secret, String);
if (! _.has(credentialSecrets,credentialToken)) {
credentialSecrets[credentialToken] = secret;
} else {
throw new Error("Duplicate credential token from OAuth login");
}
};
我从oauth
获取以下重定向网址,该网址应加载此页
# http://localhost:3000/_oauth/facebook/?code=[...]&state=[...]
<!DOCTYPE html>
<html>
<body>
<p id="completedText" style="display:none;">
Login completed. <a href="#" id="loginCompleted">
Click here</a> to close this window.
</p>
<div id="config" style="display:none;">{
"setCredentialToken":false,
"storagePrefix":"Meteor.oauth.credentialSecret-",
"isCordova":false
}</div>
<script type="text/javascript" src="/_oauth/facebook/end_of_popup_response.js">
# script included inline for ease of reading
(function () {
var config = JSON.parse(document.getElementById("config").innerHTML);
if (config.setCredentialToken) {
var credentialToken = config.credentialToken;
var credentialSecret = config.credentialSecret;
if (config.isCordova) {
var credentialString = JSON.stringify({
credentialToken: credentialToken,
credentialSecret: credentialSecret
});
window.location.hash = credentialString;
}
if (window.opener && window.opener.Package &&
window.opener.Package.oauth) {
window.opener.Package.oauth.OAuth._handleCredentialSecret(
credentialToken, credentialSecret);
} else {
try {
localStorage[config.storagePrefix + credentialToken] = credentialSecret;
} catch (err) {
// We can't do much else, but at least close the popup instead
// of having it hang around on a blank page.
}
}
}
if (! config.isCordova) {
document.getElementById("completedText").style.display = "block";
document.getElementById("loginCompleted").onclick = function(){ window.close(); };
window.close();
}
})();
</script>
</body>
</html>
在标准meteor CLI
配置中,以某种方式/ somwhere config.setCredentialToken === true
和config.setCredentialToken
以及config.credentialSecret
设置。但我无法弄清楚发生的地点/时间。
在我的accounts-facebook-client-side.bundle.js
中,没有发生这种情况。
更新
我意识到魔法发生在Meteor服务器端。如果我将oauth redirect_uri
设置为运行Meteor服务器的端口,那么我会在./_oauth/facebook
页面中获得以下内容:
<div id="config" style="display:none;">{
"setCredentialToken":true,
"credentialToken":"bsgEZrFbK-UruR1iX81dEitIR0t5nC_a1HM4-EGSGx5",
"credentialSecret":"hi8rJxbyOsI0gVaoIHrr7N9kH9k2Fku1DYQXP5BmQMt",
"storagePrefix":"Meteor.oauth.credentialSecret-",
"isCordova":false
}</div>
但我猜我是否这样做,我将无法在我的web.browser客户端页面(端口3000)上从localstorage(?)
读取这些值
解决方法的任何想法?
答案 0 :(得分:0)
解决这个问题的最简单方法是将nginx放在你的应用程序前面并使用proxy_pass根据路径对Ionic服务器和Meteor服务器的调用进行排序:
server {
listen 80;
server_name domain.tld;
location / {
proxy_pass http://domain.tld:8100;
}
location /_oauth {
proxy_pass http://domain.tld:3000;
}
location /packages {
proxy_pass http://domain.tld:3000;
}
}
我刚用accounts-facebook尝试过这种方法,并且完美无缺(你需要将浏览器指向http://domain.tld:80而不是http://domain.tld:8100),但我已经开始深入研究Meteor的代码,看看是否我可以做得更好。如果我能找到更好的解决方案,我会编辑这个答案。