このチュートリアルに従って、Node と Passport を使用して Facebook 認証を実装しています。
チュートリアルとドキュメントの両方がこれを行うように言っています:
router.get('/auth/facebook/callback',
passport.authenticate('facebook', {
successRedirect: '/',
failureRedirect: '/login'
})
);
しかし、ユーザーは自分が認証されているかどうかをどのように知るのでしょうか? ユーザーがログインしているかどうかを示すデータをフロントエンドに送信し、更新に使用できるようにしたいと思います。たとえば、ナビゲーションバーです。
私が理解していることから、Facebook での認証プロセスは次のように機能します。
- リクエストを送信し
GET /auth/facebookます。 - ヒットルート。
304 RedirectURL を添えて 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が設定されます。