2016-12-04 15 views
2

複数のユーザのパスワードをリセットできません。複数のユーザーがパスワードをリセットしようとしている間に私は立ち往生していますNodeJSおよびExpressJSでのマルチユーザパスワードリセット同時実行の問題

特定のユーザーに送信された正確なリセットトークンをリンクとしてどのようにキャプチャしますか? 2人のユーザーがパスワードをリセットしようとしたときに、resetQueryParameterが無効になります。これをどうすれば処理できますか?ユーザーがリンクをクリックし、署名を検証する際

// global variable 
var resetQueryParameters = ''; 

//CAPTURE TOKEN (QUERY PARAMS) FROM LINK 
app.get('/resetQuery/', function (req, res) { 

    //SET THE TOKEN TO VARIABLE 
    resetQueryParameters = req.query.token; 
    r.db('myDB').table('Reset_Password').filter(r.row('auth_key').eq(req.query.token)). 
    run(myConnection, function (err, cursor) { 
     if (err) { 
      return next(err); 
     } 
     cursor.toArray(function (err, result) { 
      if (err) { 
       throw err; 
      } else { 
       if (result.length > 0) { 
        res.redirect(redirectResetPage); 
       } else { 
        res.redirect(redirectLoginPage); 
       } 
       return result; 
       console.log("printing reset link from db.....", JSON.stringify(result, null, 2)); 
      } 
     }); 
    }); 
}); 

トークンを取得:

は、電子メールでのユーザーのリセットリンク上でクリックすると、クエリパラメータからトークンを取得する

function resetPassword(req, res, next) { 
    console.log('reset password called from external link.....'); 

    nJwt.verify(resetQueryParameters, secretKey, function (err, verifiedJwt) { 
     if (err) { 
      console.log('reset token not valid...', err); 
     } else { 
      var params = { 
       'username': verifiedJwt.body.details, 
       'newPassword': req.params.newPassword 
      }; 

      getApiResponse(resetURL, params, function (res1) { 
       console.log('sending reset params to server...', params); 
       if (res1.error) { 
        console.log('Could not reset password......', res1.error); 
       } else { 
        console.log('reset password success.....'); 
        resetQueryParameters = ''; 
        res.json(res1); 
       } 
      }); 
     } 
    }); 
} 
+0

なぜ 'req.query.token'を' resetPassword'メソッドに渡しませんか? – Aruna

+0

@Aruna 'req.query.token'はまだその方法でオーバーライドされています – kittu

+0

以下の私の答えをチェックしてください。req.query.resetTokenなどの他の名前と同じものを使うことができます – Aruna

答えて

1

ここでグローバル変数を使用するのは適切な方法ではありません。

リダイレクトを行うと、あなたは以下のようにredirectResetPagereq.query.tokenを渡す必要があり、

if (result.length > 0) { 
    res.redirect(redirectResetPage + '?token=' + req.query.token); 
} else { 
    res.redirect(redirectLoginPage); 
} 

とページがresetPassword方法に戻って同じトークンを渡し、request.queryまたはrequest.bodyそこから、それを使ってみましょうグローバル変数からではありません。

function resetPassword(req, res, next) { 
    console.log('reset password called from external link.....'); 

    nJwt.verify(req.query.token, secretKey, function (err, verifiedJwt) { 
     if (err) { 
      console.log('reset token not valid...', err); 
     } else { 
      var params = { 
       'username': verifiedJwt.body.details, 
       'newPassword': req.params.newPassword 
      }; 

      getApiResponse(resetURL, params, function (res1) { 
       console.log('sending reset params to server...', params); 
       if (res1.error) { 
        console.log('Could not reset password......', res1.error); 
       } else { 
        console.log('reset password success.....'); 
        resetQueryParameters = ''; 
        res.json(res1); 
       } 
      }); 
     } 
    }); 
} 

注:ベストプラクティスです、 可能ならば、データベースにこのトークンを保存したり、クッキー/ JWTトークンに格納します。

+0

私はちょうど' res.redirect(redirectResetPage + '?token =' + req.query.token); 'リダイレクトでデータを渡すことは可能ですか?私はリダイレクトでデータを渡すために 'req.flash( 'token')'を使った例を見てきました。あなたが言及してくれたように試してみてください。 – kittu

+0

トークン自体は、私が使用しているjwtトークンです。また、rethinkdbを保存してから、ユーザに電子メールで送信します。 – kittu

+0

上記のように、 htmlの場合、クライアント側のクエリ文字列から取得し、 'resetPassword'メソッド – Aruna