2016-01-12 2 views
6

Я разрабатываю приложение MEAN. Я использую паспорт для проверки подлинности - локальные, facebook и google стратегии.как обращаться с обратным вызовом паспорт-facebook в угловом клиенте?

Я использую клиент angularjs. Вся маршрутизация выполняется клиентом. Я использую только серверные данные apis.

При использовании стратегии паспорт-facebook я использую код ниже на сервере узла в соответствии с документами паспорта.

app.get('/auth/facebook',passport.authenticate('facebook-auth', { scope : ['email'] })); 
    app.get('/auth/facebook/callback',passport.authenticate('facebook-auth', { 
     successRedirect : '/home', 
     failureRedirect : '/login', 
     scope:['email'] 
    })); 

Проблема я столкнулся, когда пользователь нажимает на «Войти при помощи Facebook» кнопку

<a href="/auth/facebook" class="btn"><i class="fa fa-facebook"></i> Sign in using Facebook</a> 

Клиент будет иметь доступ «/ авт/facebook» маршрут, который будет в конечном счете перенаправлять пользователя на facebook страницу для проверки учетные данные пользователя.

После успешной проверки пользователь будет перенаправлен на маршрут «/ home», как определено в «successRedirect».

Теперь я хочу использовать пользовательскую функцию обратного вызова вместо определения перенаправления для успеха или сбоя. Это будет выглядеть, как показано ниже:

app.get('/auth/facebook/callback',passport.authenticate('facebook-auth', function(err,user,info){ 
    if(err){ 
      throw err; 
     } 
     else if(user === 'userexists'){ 
      res.json({ 
       'state':false, 
       'message':'User with this e-mail already exists' 
      }); 
     } 
     else{ 
      req.logIn(user,function(loginErr){ 
       if(loginErr){ 
        throw loginErr; 
       } 
       res.json({ 
        'state':true, 
        'message':'You logged in successfully!' 
       }); 
      }); 
     } 
})); 

корень проблемы я столкнулся здесь, я не могу использовать выше обратного вызова в качестве клиента не вызывая «авториз/facebook/обратный вызов» маршрута, его называют Facebook. Итак, нет никакого обработчика успеха, ожидающего, чтобы уловить ответ обратного вызова на стороне клиента!

Я хочу, чтобы какой-то способ получить ответ в json-форме на клиенте, чтобы устранить перенаправление на стороне сервера, а также способ передать сообщение и имя пользователя клиенту после успешной аутентификации с помощью facebook.

Я собираюсь бросить паспорт. Надеемся на любое возможное решение, прежде чем удалять много кода!

Благодаря

ответ

2

Это может быть достигнуто путем перенаправления на другую конечную точку внутри обработчика facebook обратного вызова. Нет необходимости делать res.json() на обратном вызове из facebook, так как они только делают запрос на это, чтобы сообщить вам, если auth не удалось или не удалось. From their docs:

// GET /auth/facebook/callback 
// Use passport.authenticate() as route middleware to authenticate the 
// request. If authentication fails, the user will be redirected back to the 
// login page. Otherwise, the primary route function function will be called, 
// which, in this example, will redirect the user to the home page. 

Так Facebook возвращает контроль над процессом запроса обратно к вам, когда они называют /auth/fb/callback, но это до вас, что делать дальше. Поскольку как только пользователь будет успешно аутентифицирован, у вас будет req.user, доступный на протяжении всего сеанса. На этом этапе вы можете перенаправить на что-то подобное в примере /account и проверить, req.user с req.isAuthenticated() и завершить поток, который вы желаете.

+0

Большое спасибо за четкий ответ! – Designeer

+0

@Designeer, пожалуйста. Отправьте сообщение в том случае, если вы найдете больше вопросов: D – onel0p3z

+0

@ onel0p3z Я делаю то же самое в реакциях вместо углового. Мой сервер находится в узле, и я использую выражение. Я успешно реализовал паспорт-facebook на моей стороне сервера. Теперь я вызываю '/ auth/facebook' из реакции через тег привязки. Но я понятия не имею, как вернуть ответ для этого в ответ, поскольку он обрабатывается только сервером, и я не хочу обрабатывать его через response.redirect на сервере. Не могли бы вы предложить, как справиться с этим сценарием? – Vijay

Смежные вопросы