我正试图通过像这样的第三方库登录我的流星站点: https://gist.github.com/gabrielhpugliese/4188927
在我的server.js中我有:
Meteor.methods({
facebook_login: function (fbUser, accessToken) {
var options, serviceData, userId;
serviceData = {
id: fbUser.id,
accessToken: accessToken,
email: fbUser.email
};
options = {
profile: {
name: fbUser.name
}
};
userId = Accounts.updateOrCreateUserFromExternalService('facebook', serviceData, options);
return userId;
}, ......
在我的client.js中我有:
facebookLogin: function () {
if (Meteor.user())
return;
if (!Session.equals("deviceready", true))
return;
if (!Session.equals("meteorLoggingIn", false))
return;
// Do not run if plugin not available
if (typeof window.plugins === 'undefined')
return;
if (typeof window.plugins.facebookConnect === 'undefined')
return;
// After device ready, create a local alias
var facebookConnect = window.plugins.facebookConnect;
console.log('Begin activity');
Session.equals("meteorLoggingIn", true);
Accounts._setLoggingIn(true);
facebookConnect.login({
permissions: ["email", "user_about_me"],
appId: "123456789012345"
}, function (result) {
console.log("FacebookConnect.login:" + JSON.stringify(result));
// Check for cancellation/error
if (result.cancelled || result.error) {
console.log("FacebookConnect.login:failedWithError:" + result.message);
Accounts._setLoggingIn(false);
Session.equals("meteorLoggingIn", false);
return;
}
var access_token = result.accessToken;
Meteor.call('facebook_login', result, access_token, function (error, user) {
Accounts._setLoggingIn(false);
Session.equals("meteorLoggingIn", false);
if (!error) {
var id = Accounts._makeClientLoggedIn(user.id, user.token);
console.log("FacebookConnect.login: Account activated " + JSON.stringify(Meteor.user()));
} else {
// Accounts._makeClientLoggedOut();
}
});
});
}, // login
facebookLogout: function () {
Meteor.logout();
// var facebookConnect = window.plugins.facebookConnect;
// facebookConnect.logout();
},
第三方库(在我的案例中是Facebook Android SDK)运行正常。我的问题是在“var id = Accounts._makeClientLoggedIn(user.id,user.token);”之后Meteor.user()返回Undefined。但是,如果我在浏览器中进行页面刷新工作正常,则模板将呈现为登录用户。
任何人都知道如何修复客户端上的“未定义”?
PS。在服务器端,用户集合看起来很好。流星令牌和其他一切都在那里。
答案 0 :(得分:1)
解决。我不得不添加:this.setUserId(userId.id); 在userId = Accounts.updateOrCreateUserFromExternalService('facebook',serviceData,options)之后;在server.js
答案 1 :(得分:0)
Meteor的客户端javascript无法运行光纤。 Fibers允许同步代码与javascript一起使用,因为设计js是异步的。这意味着需要使用回调来让您知道任务何时完成。
从它看起来像Accounts._makeClientLoggedIn
不接受回调&不幸的是,并没有返回任何查看其来源的数据。我不能说我自己尝试了这个,因为我不能在没有android sdk的情况下测试你的代码,但你是否尝试过使用Deps.flush进行反应性冲洗?
Meteor也有非常干净和轻松的facbeook集成。如果您只是添加facebook meteor包
meteor add accounts-facebook
您可以访问一个可爱的Meteor.loginWithFacebook
方法,该方法可以使所有内容变得活跃,并且您的代码更简单,更简单。如果您需要修改它以使用Android SDK对话框,您可以轻松修改代码,因为模块的代码是out there for you to hack up to your spec
编辑:如果您使用的是外部SDK,例如java SDK / cordova插件
设置您的插件,使其重定向到以下网址(为meteor.com托管设置):
http://yourmeteorapp.meteor.com/_oauth/facebook?display=touch&scope=your_scope_request_params&state=state&code=yourOAuthCodeFromJava&redirect=YourAPP
所以在查询字符串中我们有:
此网址主要用于模仿REDIRECT_URI的内容:https://developers.facebook.com/docs/reference/dialogs/oauth/
这将重定向到meteor的OAuth助手(https://github.com/meteor/meteor/blob/master/packages/accounts-oauth-helper/oauth_server.js)
那么会发生什么情况是您将来自Java的OAuth代码提供给meteor,它会获取OAuth令牌和用户的数据,然后将用户重定向到应用中的URL