2013-03-29 119 views
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: "123456789" 
    }, 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

流星的客户端JavaScript无法运行光纤。纤维允许同步代码与JavaScript一起使用,因为通过设计js是异步的。这意味着需要使用回调来告知您任务何时完成。

从它看起来像什么Accounts._makeClientLoggedIn不采取回调&不幸的是,并没有返回任何数据看它的来源。我不能说我自己试过这个,因为我不能测试你的代码没有android sdk,但你有没有尝试使用Deps.flush来做反应性刷新?

此外流星也有非常干净和容易的facbeook集成。如果您只是添加Facebook流星包

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 

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

  • 范围=包含您Facebook的范围PARAMS(用于权限)
  • 码=从Java SDK中您的OAuth代码
  • 重定向=凡重定向到登录后,而不是窗口之后。接近
  • 状态= A CRO公司网站伪造状态值,任何随机值会做

此网址基本上是用来模仿会怎样在被给予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

那么会发生什么事是你给的OAuth代码从Java到流星,它获取OAuth令牌和用户的数据,然后将用户重定向到URL在您的应用程序

+0

Akshat谢谢你的回答。然而,在这个特定的项目中,我使用Apache Cordova应用程序来查看我的流星网站。这样我可以访问流星网站的设备功能(例如加速度计,相机等)。目前,我不能使用accounts-facebook(不起作用),因为我在这里描述的问题:https://github.com/meteor/meteor/issues/872 –

+0

我也使用科尔多瓦类似的东西,尽管不完全相同,为什么不将新窗口改为'window.location.href =',并在对话认证URL中使用'display = touch',以便在手机上运行良好?我特意为了降低fb-js-sdk的复杂性而在最近的android设备上非常出色 – Akshat

+0

我明白你为什么要避免使用fb-js-sdk,但我没有使用它。我使用java Android SDK(包装在cordova应用程序中),我只从流星中加载JavaScript接口。通过这种方式,我为本地操作调用登录并将结果返回给javascript(非常稳定)。我不确定你的window.location.href而不是弹出的想法,因为我相信oath_server会通过发送一个''回应客户端,应用程序将退出。 –

1

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