1

私は現在、Meteor のサーバー中心のパッケージを作成しています。関連するコードは次のようになります。

__meteor_bootstrap__.app.stack.unshift({
    route: route_final,
    handle: function (req,res, next) {
        res.writeHead(200, {'Content-Type': 'text/json'});
        res.end("Print current user here");
        return;
    }.future ()
});

これは明らかにハックな方法ですが、RESTful API を作成する必要があります。

ここからアクセスするにはどうすればよいMeteor.userId()ですか?ドキュメントには、メソッドまたはパブリッシュ内からのみアクセスできると書かれています。それを回避する方法はありますか?

私が試したこと:

  • を使用してパブリッシュからキャプチャしますMeteor.publish("user", function() { user = this.userId() });
  • Cookie からトークン + ユーザー ID を取得し、次のようなものを使用して自分で認証しますMeteor.users.findOne({_id:userId,"services.resume.loginTokens.token":logintoken});
  • というメソッドを作成し、get_user_id以下のコード内から呼び出します。
4

2 に答える 2

3

最初にターゲットにする必要があるのは、ヘッダーからユーザーを識別できるものを取得することです (特に、JavaScript を実行できない時点でユーザー名を取得する必要があるため)。

Meteor は、ログイン用のセッション データを に保存しlocalStorageます。これには、javascript を介してのみアクセスできます。そのため、ページが読み込まれてヘッダーが渡されるまで、誰がログインしているかを確認できません。

これを行うには、ユーザーデータを Cookie として保存するだけでなく、次の場所にも保存する必要がありますlocalStorage

クライアント側の js - w3schools.com のCookiesetCookieと関数を使用getCookie

Deps.autorun(function() {
    if(Accounts.loginServicesConfigured() && Meteor.userId()) {
        setCookie("meteor_userid",Meteor.userId(),30);
        setCookie("meteor_logintoken",localStorage.getItem("Meteor.loginToken"),30);
    }
});

サーバー側ルート

handle: function (req,res, next) {
    //Parse cookies using get_cookies function from : http://stackoverflow.com/questions/3393854/get-and-set-a-single-cookie-with-node-js-http-server
    var userId = get_cookies(req)['meteor_usserid'];
    var loginToken = get_cookies(req)['meteor_logintoken'];

    var user = Meteor.users.findOne({_id:userId, "services.resume.loginTokens.token":loginToken});

    var loggedInUser = (user)?user.username : "Not logged in";

    res.writeHead(200, {'Content-Type': 'text/json'});
    res.end("Print current user here - " + loggedInUser)
    return;
}.future ()

Cookie を使用すると、サーバーはページが表示される前にログインしているユーザーを確認できます。ユーザーがログインするとすぐに設定され、反応的に使用されますDeps.autorun

于 2013-05-24T08:38:21.180 に答える
0

私のソリューションは、@Akshat のメソッドのサーバー部分に触発されました。私は RESTful API を作成しているので、毎回 (パラメーター、Cookie、またはヘッダーとして) userId/loginToken を渡すだけです。

興味のある方のために、パッケージとしてバンドルしました: https://github.com/gkoberger/meteor-reststop

于 2013-05-29T20:57:58.193 に答える