通过第三方库登录流星

时间:2013-03-29 23:41:38

标签: javascript meteor

我正试图通过像这样的第三方库登录我的流星站点: 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。在服务器端,用户集合看起来很好。流星令牌和其他一切都在那里。

2 个答案:

答案 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

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

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

此网址主要用于模仿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

相关问题