2016-04-07 22 views
0

この質問は、具体的にはコードの半分であり、ノードAPIから特定のユーザーのデータを実際に取得する高度なビューの半分です。ノード/エクスプレスのJWTに基づいてユーザーのデータを取得

ユーザーサインアップ/サインインはすべて正常に機能しており、ユーザーとウィジェットの間に1対多のマッピングがあるため、各ユーザーは自分のプロファイルページからウィジェットを作成および削除できます。私はJWTを生成し、フロントエンドで認証ヘッダーを保存するためにそれを使用、ユーザーのログイン・プロセスで

var User = new mongoose.Schema({ 
    email: { 
    type: String, 
    unique: true, 
    required: true 
    }, 
    hash: String, 
    salt: String 
    widgets : [{ type: Schema.Types.ObjectId, 
      ref: 'widget' 
      }], 
}); 

var Widget = new mongoose.Schema({ 
    name   : String, 
    type   : String, 
    description : String, 
}); 

:だからここ

は私のデータベースモデルです。

私の質問は2倍です。 1)現在ログインしているユーザーと関連付けられるようにウィジェットを正しく保存するにはどうすればよいですか? 2)ユーザーに関連付けられたすべてのウィジェットを取得するにはどうすればよいですか?

app.get('api/widgets', function(req, res, next){ 
    // decode authorization header to get user email 
    // run database query to return all widgets associated with user email 
}); 

app.post('api/widgets', function(req, res, next){ 
    // decode authorization header to get user email 
    // create widget and update user with widget ID 
}); 

これは正しい考えである:

私の最初の考えは、このようなものがありますか?もしそうなら、ユーザの電子メールを取得するために認証ヘッダーをデコードするにはどうすればいいですか?ユーザーと関連付けられたすべてのオブジェクトに対してこの同じプロセスを実行する必要がありますか?または、Node/Expressでこれを行うより高速で便利な方法がありますか?

+0

はい、あなたはJWT内のユーザーのウィジェットのデータを保存することができますが、各ウィジェットの動作を追加/削除した後、それを更新しなければなりません、そして、それはクライアントとの新しいJWTを同期させるために追加のロジックが必要になります。非常に簡単な方法は、セッションを使用することです。 – alexmac

+0

申し訳ありませんが、私は元の質問ではっきりしていたかどうかは分かりません。私はJWTにウィジェットデータを保存したくありません。私はちょうどJWTにユーザーの電子メールを保存しています。「ウィジェットIDを持つユーザーを更新する」とは、データベース内のユーザーをウィジェットIDで更新することを意味します。 – jmknoll

+0

これは正しい方法だと思います。あなたがエンコードされたjwtトークンにいくつかのライブラリを使用している場合は、ほとんどの場合、おそらくデコード機能もあります。ウィジェットを保存するには、単純にウィジェットモデル 'new Widget({name ....})のsave関数を使用します。save(function(err、widget){ここで$ push演算子を使ってユーザを更新}}' exec(function(err、user){ここにはウィジェットの配列がありますが、IDではなく、ウィジェットコレクションからの実際のオブジェクト}); – Molda

答えて

2

これは正しい考えですか?

私の意見では、はい、それは正しいです。

もしそうなら、私はユーザの電子メールを取得するために認証ヘッダーをデコードする方法を教えてください。

jsonwebtokenパッケージを使用している場合、トークンをデコードする方法はverifyです。電子メールと名前のような単一のトークンに複数の値を格納することもできます。 verifyはトークンを両方のプロパティを持つオブジェクトにデコードします。

ユーザーと関連付けられたすべてのオブジェクトについて、この同じプロセスを実行する必要がありますか?または、Node/Expressでこれを行うより高速で便利な方法がありますか?

これらのオブジェクトをすべての要求にロードするのが最も一般的な方法でしょう。このローディングプロセスがアプリケーションの処理速度を低下させている場合は、node-cacheまたはRedis(分散アプリケーションクラスタを使用する場合に推奨)を使用してキャッシュすることができます。

また、すべてのルートでユーザーのトークンを電子メールにデコードする代わりに、localsにトークンをデコードして保存するcatch all routeを使用することが一般的です。ドライ!

app.use(function (req, res, next) { 
    var token = req.signedCookies.token 
    res.locals.user = jwt.verify(token, 'my-secret') 
    next() 
}) 
+0

ありがとうございます。それはとても役に立ちました。 – jmknoll

関連する問題