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() は Undefined を返します。ただし、ブラウザでページを更新すると正常に機能し、テンプレートはログインしたユーザーとしてレンダリングされます。

クライアントで「未定義」を修正する方法を知っている人はいますか??

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 はファイバーを実行できません。ファイバーは、設計上 js が非同期であるため、javascript で同期コードを使用できます。これは、タスクが完了したことを知らせるために使用する必要があるコールバックがあることを意味します。

残念ながら、コールバックを取得せAccounts._makeClientLoggedInず、そのソースを参照するデータを返しません。Android SDK なしではコードをテストできないため、自分でこれを試したとは言えませんが、Deps.flushを使用してリアクティブ フラッシュを実行してみましたか?

また、Meteor には非常にクリーンで簡単な facbeook 統合もあります。Facebookの流星パッケージを追加するだけの場合

meteor add accounts-facebook

Meteor.loginWithFacebookすべてをリアクティブにし、コードをよりシンプルかつ簡単にする素敵なメソッドにアクセスできます。代わりに Android SDK ダイアログを使用するように変更する必要がある場合は、仕様に合わせてハックするモジュールのコードが公開されているため、コードを簡単に変更できます。

編集: Java SDK/cordova プラグインなどの外部 SDK を使用している場合

次の URL にリダイレクトするようにプラグインを設定します (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= クロス サイト フォージェリ状態の値。任意のランダムな値でかまいません

この URL は基本的に、 https ://developers.facebook.com/docs/reference/dialogs/oauth/ の REDIRECT_URI に与えられるものを模倣するために使用されます。

これにより、meteor の OAuth ヘルパー ( https://github.com/meteor/meteor/blob/master/packages/accounts-oauth-helper/oauth_server.js )にリダイレクトされます。

Java から meteor に OAuth コードを渡すと、OAuth トークンとユーザーのデータが取得され、ユーザーがアプリ内の URL にリダイレクトされます。

于 2013-03-30T00:40:28.970 に答える