5

私は NodeJs REST Service を持っています。それを呼び出しましょう。バックエンド側にNodeRestを、フロントエンド側に AngularJs を使用します。

NodeRestは、私の場合は AngularJs アプリである Web アプリだけでなく、モバイル アプリでも使用されると想定されています。

PassportJs を使用する場合、NodeRest のアーキテクチャは次の問題を解決する必要があります。

サーバーは、承認のためにユーザーを facebook にリダイレクトすべきではありません。

app.get('/auth/facebook', passport.authenticate('facebook'));

呼ばれました。

リダイレクトする場合、コールバック URL がNodeRest httpL//noderest/facebook/callback にリンクされているため、クライアントは何も取得しません。代わりに、リダイレクト uri を提供する必要があるため、それをクライアント (angularJs、モバイルなど) に送り返すことができます。そのようなもの:

app.get('/auth/facebook', passport.authenticate('facebook', function(redirectUri){ 
//emit socket event to the client with redirect uri as a response data. })); 

私は、承認プロセス中の通信チャネルとして socket.io を使用することにしました。

クライアント:

var socket = io.connect(baseUrl);
    socket.on('auth:facebook:callback:getCalled', function (data) {
      // callback get called on server side.
      // user has been authenicated.
      // so now, user can talk with our NodeRest server to get and post data.      
      var firstName = data.firstName;
      var lastName = data.lastName;
});

$http.get(baseUrl + '/login/facebook').success(function(data, status, headers, config){
      redirectUriToAuthenticate = data;      
      $location.path(data);
});

クライアントは、facebook/twitter などにリダイレクトして、ユーザーの承認を得る責任があります。その直後、ユーザーはコールバック URL にリダイレクトされます。

サーバ:

app.get('/auth/facebook/callback', function(){
  passport.authenticate('facebook', { successRedirect: '/', failureRedirect: '/login' })
  //socket.io emit event to the client with user data.
  io.sockets.on('connection', function (socket) {
  socket.emit('auth:facebook:callback:getCalled', { data: User });
});

これらすべての背後にある一般的な考え方は、さまざまな種類のクライアント アプリ (モバイル、Web、デスクトップなど) から認証を受けることです。クライアントは、oauth2 プロバイダー (facebook、twitter など) へのリダイレクト URI を取得し、それ自体でその URI にリダイレクトできる必要があります。NodeRestは、以降のステップを処理します (つまり、コールバックを処理し、クライアントに通知します)。

私が取り組んでいるのが良い解決策であるかどうかはわかりませんので、どんな種類のフィードバックでも役に立ちます. あらゆる種類のフィードバックをいただければ幸いです。

事前にありがとう、ジュリアン

4

1 に答える 1

1

Passport はこの問題について十分に文書化されていません - 私も長い間苦労しました。私は、passport.authenticate(type, fn)(req, res, next) を呼び出すことができ、fn 内で、ログインできるユーザーとできないユーザーを区別できることを発見しました。ただし、 req.logIn を呼び出すのはあなた次第です。

参考までに、セッションを使用していると仮定しています。

module.exports.createSession = function(req, res, next) {
  passport.authenticate('local', function(err, user, info) {
    if (err) {
      res.json(500, {ok: false});
    } else if(!user) {
      // you would probably want to do more work here
      // for example distinguishing between bad login credentials,
      // canceling, users not ready to log in (pending), etc.
      res.json(401, {ok: false});
    } else {
      req.logIn(user, function(err) {
        if (err) {
          res.json(500,{ok: false});
        } else {
          res.json(200, {
            ok:req.isAuthenticated(),
            username: req.user.username,
            email: req.user.email
          });
        }
      });
    }
  })(req, res, next);
};

これはローカル認証用に設定されていますが、何も変更しなくても Facebook 認証で動作するはずです。

于 2014-04-09T02:24:59.020 に答える