2

このチュートリアルに従って、Node と Passport を使用して Facebook 認証を実装しています。

チュートリアルとドキュメントの両方がこれを行うように言っています:

router.get('/auth/facebook/callback',
  passport.authenticate('facebook', {
    successRedirect: '/',
    failureRedirect: '/login'
  })
);

しかし、ユーザーは自分が認証されているかどうかをどのように知るのでしょうか? ユーザーがログインしているかどうかを示すデータをフロントエンドに送信し、更新に使用できるようにしたいと思います。たとえば、ナビゲーションバーです。

私が理解していることから、Facebook での認証プロセスは次のように機能します。

  1. リクエストを送信しGET /auth/facebookます。
  2. ヒットルート。
  3. 304 RedirectURL を添えて Facebook ポータルに送り返します。
  4. コールバック URL を使用して Facebook ポータルにリクエストを送信します。
  5. ユーザーがポータルで [同意する] をクリックします。
  6. Facebook304 Redirectは、URL がコールバック URL である を返します。
  7. リクエストはコールバック URL (この場合は ) に送信されますGET /auth/facebook/callback
  8. cbpassport.use(obj, cb)実行されます。
  9. A304 Redirectが返され、URL は成功または失敗に応じて/orになります。/login
  10. 要求が/またはに送信され/loginます。

ログインしたユーザーでフロントエンドを更新する方法がわかりません。

router.get('/auth/facebook/callback',
  passport.authenticate('facebook'),
  function(req, res) {
    var userCopy = JSON.parse(JSON.stringify(req.user));
    delete userCopy.auth;
    res.status(200).json(userCopy);
  }
);

$http.get().then()データを受け取るがないため、これは機能しません。


いくつかのクエリパラメーターを追加してみました:

successRedirect: '/?foo=bar'

しかし、それは私にとってはうまくいきません。URLバーには次のように表示されますがhttp://localhost:3000/?foo=bar#_=_、これは何も記録しません:

app.get('/*', function(req, res) {
  var url = path.resolve(__dirname + '/../client/' + envFolder + '/index.html');
  res.sendFile(url, null, function(err) {
    if (err) {
      return res.status(500).send(err);
    }
    console.log('here');
    console.log(req.query);
    return res.status(200).end();
  });
});

私がするとき、それは動作しますsuccessRedirect: '/home?facebook=true'。しかし、 の中では、それ以外のものsendFileを送り返すことはできません。試してみると、次のエラーが表示されます。おそらく、ファイルを送り返し、いくつかのヘッダーを設定しているために、別のヘッダーで何かを送り返そうとしています。だから私は何をすべきかわからない。res.send('Authenticated with Facebook')Error: Can't set headers after they are sent.sendFile


私がたどり着いたアプローチは、runブロックを使用することです:

function run($http, Session, $cookies) {
  $http
    .get('/current-user')
    .then(function(response) {
      Session.setUser(response.data);
      $cookies.put('userId', response.data._id);
    })
  ;
}
  1. これが最善のアプローチかどうかはわかりません。
  2. HTTPリクエストを期待していないため、テストが台無しになり、常にそうしたくない場合にセッションとCookieが設定されます。
4

1 に答える 1