私は 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は、以降のステップを処理します (つまり、コールバックを処理し、クライアントに通知します)。
私が取り組んでいるのが良い解決策であるかどうかはわかりませんので、どんな種類のフィードバックでも役に立ちます. あらゆる種類のフィードバックをいただければ幸いです。
事前にありがとう、ジュリアン