31

サーバーでユーザー認証にPassportを使用しています。ユーザーが (ユーザー名とパスワードを使用して) ローカルでサインインしている場合、サーバーは localstorage に格納されているJWTをユーザーに送信し、ユーザー認証を必要とする API 呼び出しごとにサーバーに送り返します。

Facebook と Google のログインもサポートしたいと考えています。私は Passport から始めたので、 passport-facebookとPassport -google-oauthを使用して、Passport 戦略を継続するのが最善であると考えました。

Facebook について言及しますが、どちらの戦略も同じように動作します。どちらもサーバー ルートへのリダイレクトが必要です ( 「/auth/facebook」「/auth/facebook/callback」 )。このプロセスは、facebook\google ID とトークンを含むユーザーを DB に保存するところまで成功しています。

サーバー上でユーザーが作成されると、JWT が作成されます (facebook\google から受信したトークンに依存する必要はありません)。

     ... // Passport facebook startegy
     var newUser = new User();
     newUser.facebook = {};
     newUser.facebook.id = profile.id; 
     newUser.facebook.token = token; // token received from facebook
     newUser.facebook.name  = profile.displayName;   
     newUser.save(function(err) {
          if (err)
               throw err;
          // if successful, return the new user
          newUser.jwtoken = newUser.generateJwt(); // JWT CREATION!
          return done(null, newUser);
     });

問題は、作成後、JWT を client に送信する適切な方法が見つからないことです。アプリにもリダイレクトする必要があるためです。

app.get('/auth/facebook/callback',
    passport.authenticate('facebook', {
        session: false,
        successRedirect : '/',
        failureRedirect : '/'
    }), (req, res) => {
        var token = req.user.jwtoken;
        res.json({token: token});
    });

上記のコードはアプリのメイン ページにリダイレクトしますが、 token を取得できません。successRedirect を削除すると、トークンは取得されますが、アプリにリダイレクトされません

そのための解決策はありますか?私のアプローチは間違っていますか?どんな提案もします。

4

3 に答える 3