2013-03-29 116 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