このチュートリアルに従って、Node と Passport を使用して Facebook 認証を実装しています。
チュートリアルとドキュメントの両方がこれを行うように言っています:
router.get('/auth/facebook/callback',
passport.authenticate('facebook', {
successRedirect: '/',
failureRedirect: '/login'
})
);
しかし、ユーザーは自分が認証されているかどうかをどのように知るのでしょうか? ユーザーがログインしているかどうかを示すデータをフロントエンドに送信し、更新に使用できるようにしたいと思います。たとえば、ナビゲーションバーです。
私が理解していることから、Facebook での認証プロセスは次のように機能します。
- リクエストを送信し
GET /auth/facebook
ます。 - ヒットルート。
304 Redirect
URL を添えて Facebook ポータルに送り返します。- コールバック URL を使用して Facebook ポータルにリクエストを送信します。
- ユーザーがポータルで [同意する] をクリックします。
- Facebook
304 Redirect
は、URL がコールバック URL である を返します。 - リクエストはコールバック URL (この場合は ) に送信されます
GET /auth/facebook/callback
。 - の
cb
がpassport.use(obj, cb)
実行されます。 - A
304 Redirect
が返され、URL は成功または失敗に応じて/
orになります。/login
- 要求が
/
またはに送信され/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);
})
;
}
- これが最善のアプローチかどうかはわかりません。
- HTTPリクエストを期待していないため、テストが台無しになり、常にそうしたくない場合にセッションとCookieが設定されます。