0

Я пытаюсь внедрить простую интеграцию с Facebook, используя паспорт (pass-facebook). Касательно this documentation over here я некоторый код здесь из моих server.js:Node.js/authentication-аутентификация Facebook

var express = require('express'), 
    passport = require('passport'), 
    FacebookStrategy = require('passport-facebook').Strategy, 
    app = express(); 

// Facebook authentication: 
passport.use(
    new FacebookStrategy({ 
     clientID: "fb client id here", 
     clientSecret: "fb client secret key here", 
     callbackURL: "http://localhost/web-apps/facebook-passport/auth/facebook/" 
    }, 
    function(accessToken, refreshToken, profile, done) { 
     console.log("auth is done!"); 
     done(null, profile); 
    }) 
); 

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

app.get(
    '/web-apps/facebook-passport/auth/facebook/', 
    passport.authenticate('facebook', { 
     successRedirect: '/', 
     failureRedirect: '/login' 
    }) 
); 

app.get('/web-apps/facebook-passport/', function(req, res) { 
    res.send('<a href="/web-apps/facebook-passport/auth/facebook">Login with Facebook</a>'); 
}); 

app.listen(80); 

Код в основном обеспечивает связь, которая должна привести к проверке подлинности Facebook (/ facebook/авт), попросите клиента для разрешения, а затем перенаправлять пользователь возвращается на мою страницу с некоторыми токенами доступа и сведениями клиента. Однако, когда я бегу мой сервер и попытаться сделать это, нажав на ссылку я получил

passport.initialize() промежуточное программное обеспечение не используется

Паспорт StackTrace:

Error: passport.initialize() middleware not in use 
    at IncomingMessage.req.login.req.logIn (C:\xampp\htdocs\web-apps\facebook-passport\node_modules\passport\lib\http\request.js:44:34) 
    at Strategy.strategy.success (C:\xampp\htdocs\web-apps\facebook-passport\node_modules\passport\lib\middleware\authenticate.js:228:13) 
    at verified (C:\xampp\htdocs\web-apps\facebook-passport\node_modules\passport-facebook\node_modules\passport-oauth2\lib\strategy.js:179:18) 
    at Strategy.app.get.passport.authenticate.successRedirect [as _verify] (C:\xampp\htdocs\web-apps\facebook-passport\server.js:22:3) 
    at C:\xampp\htdocs\web-apps\facebook-passport\node_modules\passport-facebook\node_modules\passport-oauth2\lib\strategy.js:195:22 
    at C:\xampp\htdocs\web-apps\facebook-passport\node_modules\passport-facebook\lib\strategy.js:183:5 
    at passBackControl (C:\xampp\htdocs\web-apps\facebook-passport\node_modules\passport-facebook\node_modules\passport-oauth2\node_modules\oauth\lib\oauth2.js:126:9) 
    at IncomingMessage.<anonymous> (C:\xampp\htdocs\web-apps\facebook-passport\node_modules\passport-facebook\node_modules\passport-oauth2\node_modules\oauth\lib\oauth2.js:143:7) 
    at IncomingMessage.emit (events.js:117:20) 
    at _stream_readable.js:944:16 

Я думаю, мне нужно добавить что-то вроде app.configuration к моему серверному скрипту, но они ушли в Express 4.x. Мне интересно, как я могу это исправить?

Мой узел пакеты:

[email protected]

[email protected]

[email protected]

*** * UPDATE ****

Я добавил следующий код в начало моего scri пт, который был результат потери предыдущего сообщения об ошибке:

app.use(bodyParser()); 

// Use the passport package in our application 
app.use(passport.initialize()); 

// Create our Express router 
var router = express.Router(); 

Однако, я получил эту новую ошибку говоря

Этого код авторизации используется.

Это трассировки стека:

FacebookTokenError: This authorization code has been used. 
    at Strategy.parseErrorResponse (C:\xampp\htdocs\web-apps\facebook-passport\node_modules\passport-facebook\lib\strategy.js:198:12) 
    at Strategy.OAuth2Strategy._createOAuthError (C:\xampp\htdocs\web-apps\facebook-passport\node_modules\passport-facebook\node_modules\passport-oauth2\lib\strategy.js:345:16) 
    at C:\xampp\htdocs\web-apps\facebook-passport\node_modules\passport-facebook\node_modules\passport-oauth2\lib\strategy.js:171:43 
    at C:\xampp\htdocs\web-apps\facebook-passport\node_modules\passport-facebook\node_modules\passport-oauth2\node_modules\oauth\lib\oauth2.js:177:18 
    at passBackControl (C:\xampp\htdocs\web-apps\facebook-passport\node_modules\passport-facebook\node_modules\passport-oauth2\node_modules\oauth\lib\oauth2.js:124:9) 
    at IncomingMessage.<anonymous> (C:\xampp\htdocs\web-apps\facebook-passport\node_modules\passport-facebook\node_modules\passport-oauth2\node_modules\oauth\lib\oauth2.js:143:7) 
    at IncomingMessage.emit (events.js:117:20) 
    at _stream_readable.js:944:16 
    at process._tickCallback (node.js:442:13) 

Решено:

Проблемы с URI.

+0

Таким образом, вы не можете использовать порт, который уже используется на вашем сервере. Итак, когда вы выбираете другой порт, который не дает ошибку «EADDRINUSE», вы затем помещаете этот новый порт в URL-адрес, который вы пытаетесь? Кроме того, я не знаю, почему вы упоминаете 'socket.io', так как я не вижу никакого кода' socket.io' где угодно. В любом случае вам нужно запустить обычный веб-сервер. Кроме того, почему существует другой веб-сервер? Если вы используете nodejs, это должен быть ваш ОДИН веб-сервер в этом поле, если вы намеренно не работаете с несколькими веб-серверами на одном и том же хосте, а на разных портах. – jfriend00

+0

Я прочитал ваше сообщение. Я не понимаю нескольких его частей, поэтому я задал несколько вопросов (ни один из которых вы не ответили). Только один серверный процесс может прослушивать данный порт. Если у вас уже есть веб-сервер на порту 8081, вы не можете сделать другой сервер на том же хосте, который прослушивает один и тот же порт. Период. Вот как работает TCP. Входящий трафик на конкретном порту переходит к одному и только одному процессу, который прослушивает этот порт. Есть ли еще вопрос к этому? – jfriend00

ответ

0

Попробуйте использовать этот способ в вашем

app.get('/web-apps/facebook-passport/auth/facebook', passport.authenticate('facebook-signup', { session: false })); 

вместо

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

Я думаю, что проблема в том, что facebook авторизовались Вам возвращается маркер, если вы не закрыть сессию, facebook ждет за тот же знак. Использование {session: false} вызывает сеанс закрытия facebook после завершения проверки подлинности. Каждый раз, когда вы выполняете аутентификацию, вы будете получать новый токен.

У меня были некоторые проблемы, подобные этому раньше, я не эксперт, но я решил это таким образом.

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