1

我正在尝试通过像这样的第三方库登录我的流星网站: 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() 返回未定义。但是,如果我在浏览器中进行页面刷新工作正常并且模板呈现为登录用户。

任何人都知道如何修复客户端上的“未定义”?

PS。在服务器端,用户集合看起来不错。流星令牌和其他一切都在那里。

4

2 回答 2

1

解决了。我必须添加:this.setUserId(userId.id); 在 userId = Accounts.updateOrCreateUserFromExternalService('facebook', serviceData, options); 之后 在 server.js

于 2013-03-30T12:08:30.317 回答
0

Meteor 的客户端 JavaScript 不能运行光纤。Fibers 允许同步代码与 javascript 一起使用,因为设计上 js 是异步的。这意味着需要使用回调来让您知道任务何时完成。

从它的样子看,它Accounts._makeClientLoggedIn不需要回调,不幸的是,它不会返回任何查看其来源的数据。我不能说我自己试过这个,因为我无法在没有 android sdk 的情况下测试你的代码,但你有没有尝试过使用Deps.flush进行反应性刷新?

此外,Meteor 还具有非常干净和简单的 facbeook 集成。如果您只是添加 facebook meteor 包

meteor add accounts-facebook

您可以访问一个可爱的Meteor.loginWithFacebook方法,该方法可以使所有内容都具有反应性,并使您的代码更简单,更容易。如果您需要修改它以使用 Android SDK 对话框,您可以轻松地修改代码,因为模块的代码在那里供您破解您的规范

编辑:如果您使用的是外部 SDK,例如 java SDK/cordova 插件

设置您的插件,使其重定向到以下 URL(为meteor.com 托管设置):

http://yourmeteorapp.meteor.com/_oauth/facebook?display=touch&scope=your_scope_request_params&state=state&code=yourOAuthCodeFromJava&redirect=YourAPP

所以在查询字符串中我们有:

  • scope= 包含您的 facebook 范围参数(用于权限)
  • 代码=您来自 java sdk 的 OAuth 代码
  • redirect=登录后重定向到哪里而不是 window.close
  • state= 跨站点伪造状态值,任何随机值都可以

此 url 基本上用于模仿在以下位置提供给 REDIRECT_URI 的内容:https ://developers.facebook.com/docs/reference/dialogs/oauth/

这将重定向到流星的 OAuth 助手(在https://github.com/meteor/meteor/blob/master/packages/accounts-oauth-helper/oauth_server.js

那么会发生什么情况,您将 Java 中的 OAuth 代码提供给流星,它会获取 OAuth 令牌和用户数据,然后将用户重定向到您应用中的 URL

于 2013-03-30T00:40:28.970 回答