2015-01-25 1 views
2

나는 인증을 위해 페이스 북 전략과 함께 여권을 사용합니다. 저는 클라이언트 측에 각도를 사용하고 서버 측에 표현합니다. 사용자가 Facebook에서 로그인하여 성공적으로 인증되면 다시 기본 페이지로 리디렉션됩니다. 그러나 나는 돌아올 때 항상 빈 페이지를 얻는다. 새로 고침 후 페이지가 다시 정상적으로 나타납니다.특급 여권 인증 빈 페이지에서 리디렉션

facebook.js : 여기

내 구현

'use strict'; 
var passport = require('passport'), 
    url = require('url'), 
    FacebookStrategy = require('passport-facebook').Strategy, 
    config = require('../config'), 
    user = require('../../app/user/user.server.controller'); 

module.exports = function() { 
    // Use the Passport's Facebook strategy 
    passport.use(new FacebookStrategy({ 
      clientID: config.facebook.clientID, 
      clientSecret: config.facebook.clientSecret, 
      callbackURL: config.facebook.callbackURL, 
      profileFields: ['id', 'displayName', 'email'], 
      passReqToCallback: true 
     }, 
     function(req, accessToken, refreshToken, profile, done) { 
      // Set the user's provider data and include tokens 
      var providerData = profile._json; 
      providerData.accessToken = accessToken; 
      providerData.refreshToken = refreshToken; 

      var providerUserProfile = { 
       username: profile.displayName, 
       email: profile.email, 
       provider: 'facebook', 
       providerId: profile.id, 
       providerData: providerData 
      }; 

      // Save the user OAuth profile 
      user.saveOAuthUserProfile(req, providerUserProfile, done); 
     } 
    )); 
}; 

설정/passport.js

'use strict'; 
var passport = require('passport'), 
    mongoose = require('mongoose'); 

module.exports = function() { 
    var User = mongoose.model('User'); 

    passport.serializeUser(function(user, done) { 
     done(null, user.id); 
    }); 

    passport.deserializeUser(function(id, done) { 
     User.findOne({ 
      _id: id 
     }, '-password -salt', function(err, user) { 
      done(err, user); 
     }); 
    }); 

    require('./strategies/local.js')(); 
    require('./strategies/twitter.js')(); 
    require('./strategies/facebook.js')(); 
    require('./strategies/google.js')(); 

}; 

user.server.route.js

// Invoke 'strict' JavaScript mode 
'use strict'; 

// Load the module dependencies 
var user = require('./user.server.controller'), 
    passport = require('passport'); 

// Define the routes module' method 
module.exports = function(app) { 
    // Set up the 'signup' routes 
    app.route('/signup') 
     .get(user.renderSignup) 
     .post(user.signup); 

    // Set up the 'signin' routes 
    app.route('/signin') 
     .get(user.renderSignin) 
     .post(passport.authenticate('local', { 
      successRedirect: '/', 
      failureRedirect: '/signin', 
      failureFlash: true 
     })); 

    // Set up the Facebook OAuth routes 
    app.get('/oauth/facebook', passport.authenticate('facebook', { 
     failureRedirect: '/signin' 
    })); 
    app.get('/oauth/facebook/callback', passport.authenticate('facebook', { 
     failureRedirect: '/signin', 
     successRedirect: '/' 
    })); 

    // Set up the Twitter OAuth routes 
    app.get('/oauth/twitter', passport.authenticate('twitter', { 
     failureRedirect: '/signin' 
    })); 
    app.get('/oauth/twitter/callback', passport.authenticate('twitter', { 
     failureRedirect: '/signin', 
     successRedirect: '/' 
    })); 

    // Set up the Google OAuth routes 
    app.get('/oauth/google', passport.authenticate('google', { 
     scope: [ 
      'https://www.googleapis.com/auth/userinfo.profile', 
      'https://www.googleapis.com/auth/userinfo.email' 
     ], 
     failureRedirect: '/signin' 
    })); 
    app.get('/oauth/google/callback', passport.authenticate('google', { 
     failureRedirect: '/signin', 
     successRedirect: '/' 
    })); 

    // Set up the 'signout' route 
    app.get('/signout', user.signout); 
}; 

index.ejs

<!DOCTYPE html> 
<html xmlns:ng="http://angularjs.org"> 
<head> 
    <title><%= title %></title> 


</head> 
<body> 


<section ng-view></section> 


<script type="text/javascript"> 
    window.user = <%- user || 'null' %>; 
</script> 


<script type="text/javascript" src="/public/lib/angular/angular.js"></script> 
<script type="text/javascript" src="/public/lib/angular-route/angular-route.js"></script> 
<script type="text/javascript" src="/public/lib/angular-resource/angular-resource.js"></script> 

<script type="text/javascript" src="/public/article/article.client.module.js"></script> 
<script type="text/javascript" src="/public/article/article.client.controller.js"></script> 
<script type="text/javascript" src="/public/article/article.client.route.js"></script> 
<script type="text/javascript" src="/public/article/article.client.resource.js"></script> 

<script type="text/javascript" src="/public/projectTemplate/projectTemplate.client.module.js"></script> 
<script type="text/javascript" src="/public/projectTemplate/projectTemplate.client.controller.js"></script> 
<script type="text/javascript" src="/public/projectTemplate/projectTemplate.client.route.js"></script> 
<script type="text/javascript" src="/public/projectTemplate/projectTemplate.client.resource.js"></script> 
<script type="text/javascript" src="/public/projectTemplate/taskTemplate.client.resource.js"></script> 


<script type="text/javascript" src="/public/index/index.client.module.js"></script> 
<script type="text/javascript" src="/public/index/index.client.route.js"></script> 
<script type="text/javascript" src="/public/index/index.client.controller.js"></script> 


<script type="text/javascript" src="/public/user/user.client.module.js"></script> 
<script type="text/javascript" src="/public/user/authentication.client.service.js"></script> 



<script type="text/javascript" src="/public/application.js"></script> 


</body> 
</html> 

index.client.view.html :

<section ng-controller="IndexController"> 

    <div data-ng-show="!authentication.user"> 
     <a href="/signup">Signup</a> 
     <a href="/signin">Signin</a> 
    </div> 
    <div data-ng-show="authentication.user"> 
     <h1>Hello <span data-ng-bind="authentication.user.fullName"></span></h1> 
     <a href="/signout">Signout</a> 
     <ul> 
      <li><a href="/#!/article">List Articles</a></li> 
      <li><a href="/#!/article/create">Create an Article</a></li> 
     </ul> 

     <ul> 
      <li><a href="/#!/projectTemplate">List Project Templates</a></li> 
      <li><a href="/#!/projectTemplate/create">Create a Project Template</a></li> 
     </ul> 


    </div> 



</section> 

편집 : 나는이 책의 샘플 코드를 사용하고 있습니다 : 당신은 여기에 코드를 다운로드 할 수

https://www.packtpub.com/books/content/support/17478

. 마지막 장을 선택하십시오. 그것은 페이 스북 전략에 몇 가지 버그가있다, 당신은 이메일 필드 (위의 코드를 참조하십시오)

같은 흰색 화면 동작이 있습니다. 나는 크롬과 사파리를 시험해 보았습니다.

답변

0

접근 방식 1 : 성공 리디렉션은 홈페이지로 이동합니다. "/"하지만 홈페이지 경로는 언급하지 않았습니다. 홈페이지 경로에 있습니다. 당신은 console.log ('페이지 히트')를 사용하여 페이지가 리디렉션 될 때 서버에서 렌더링되는지 확인하십시오.

접근법 2 페이스 북은 인증 콜백 URL에 #을 추가합니다. 정의하지 않은 경로로 해석 될 수있는 각도 라우팅을 사용하는 경우 페이지가로드되지 않습니다.

+0

이 책의 샘플 코드를 사용 중입니다. 여기에서 다운로드하십시오 : https://www.packtpub.com/books/content/support/17478 – John

+0

위에서 언급 한 두 가지를 시도 했습니까? 각도가없고 노드 측에서 페이지가 로깅되지 않고 그것을하고 있니? – PureText

+0

예. 6 장을 다운로드하십시오. 각도가 없습니다. (저는 앵귤러 문제라고 생각하지 않습니다. index.html은 네트워킹 디버그 패널에서 다운로드되지 않습니다) – John

0

Facebook은 콜백 URL 끝에 가짜 해쉬 (#_=_)를 추가합니다. Github issue here을 참조하십시오. 이것은 각도를 혼란스럽게합니다. 이것을 처리하거나 제거하려면 특별한 케이스가 필요합니다. Github 문제에는 수정 사항이 있습니다.

+0

수정 코드가 이미 코드에 있습니다. – John