2015-11-10 2 views
3

Я смог использовать node.js и passport.js для подключения к Facebook с помощью проекта GitHub, доступного по адресу: https://github.com/jaredhanson/passport-facebook/tree/master/examples/login.Использование Passport.js за корпоративным брандмауэром для стратегии Facebook

Вот что app.js код делает:

var express = require('express') 
    , passport = require('passport') 
    , util = require('util') 
    , FacebookStrategy = require('passport-facebook').Strategy 
    , logger = require('morgan') 
    , session = require('express-session') 
    , bodyParser = require("body-parser") 
    , cookieParser = require("cookie-parser") 
    , methodOverride = require('method-override'); 

var FACEBOOK_APP_ID = "--insert-facebook-app-id-here--" 
var FACEBOOK_APP_SECRET = "--insert-facebook-app-secret-here--"; 


// Passport session setup. 
// To support persistent login sessions, Passport needs to be able to 
// serialize users into and deserialize users out of the session. Typically, 
// this will be as simple as storing the user ID when serializing, and finding 
// the user by ID when deserializing. However, since this example does not 
// have a database of user records, the complete Facebook profile is serialized 
// and deserialized. 
passport.serializeUser(function(user, done) { 
    done(null, user); 
}); 

passport.deserializeUser(function(obj, done) { 
    done(null, obj); 
}); 


// Use the FacebookStrategy within Passport. 
// Strategies in Passport require a `verify` function, which accept 
// credentials (in this case, an accessToken, refreshToken, and Facebook 
// profile), and invoke a callback with a user object. 
passport.use(new FacebookStrategy({ 
    clientID: FACEBOOK_APP_ID, 
    clientSecret: FACEBOOK_APP_SECRET, 
    callbackURL: "http://localhost:3000/auth/facebook/callback" 
    }, 
    function(accessToken, refreshToken, profile, done) { 
    // asynchronous verification, for effect... 
    process.nextTick(function() { 

     // To keep the example simple, the user's Facebook profile is returned to 
     // represent the logged-in user. In a typical application, you would want 
     // to associate the Facebook account with a user record in your database, 
     // and return that user instead. 
     return done(null, profile); 
    }); 
    } 
)); 




var app = express(); 

// configure Express 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'ejs'); 
    app.use(logger()); 
    app.use(cookieParser()); 
    app.use(bodyParser()); 
    app.use(methodOverride()); 
    app.use(session({ secret: 'keyboard cat' })); 
    // Initialize Passport! Also use passport.session() middleware, to support 
    // persistent login sessions (recommended). 
    app.use(passport.initialize()); 
    app.use(passport.session()); 
    app.use(express.static(__dirname + '/public')); 


app.get('/', function(req, res){ 
    res.render('index', { user: req.user }); 
}); 

app.get('/account', ensureAuthenticated, function(req, res){ 
    res.render('account', { user: req.user }); 
}); 

app.get('/login', function(req, res){ 
    res.render('login', { user: req.user }); 
}); 

// GET /auth/facebook 
// Use passport.authenticate() as route middleware to authenticate the 
// request. The first step in Facebook authentication will involve 
// redirecting the user to facebook.com. After authorization, Facebook will 
// redirect the user back to this application at /auth/facebook/callback 
app.get('/auth/facebook', 
    passport.authenticate('facebook'), 
    function(req, res){ 
    // The request will be redirected to Facebook for authentication, so this 
    // function will not be called. 
    }); 

// 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. 
app.get('/auth/facebook/callback', 
    passport.authenticate('facebook', { failureRedirect: '/login' }), 
    function(req, res) { 
    res.redirect('/'); 
    }); 

app.get('/logout', function(req, res){ 
    req.logout(); 
    res.redirect('/'); 
}); 

app.listen(3000); 


// Simple route middleware to ensure user is authenticated. 
// Use this route middleware on any resource that needs to be protected. If 
// the request is authenticated (typically via a persistent login session), 
// the request will proceed. Otherwise, the user will be redirected to the 
// login page. 
function ensureAuthenticated(req, res, next) { 
    if (req.isAuthenticated()) { return next(); } 
    res.redirect('/login') 
} 

код отлично работает, если я просто используя Интернет, без прокси-сервера, но если я за корпоративным брандмауэром, то я получаю следующее сообщение об ошибке:

InternalOAuthError: Failed to obtain access token 
    at Strategy.OAuth2Strategy._createOAuthError (C:\FacebookExample\passport-facebook\examples\login\node_modules\passport-facebook\node_modules\passport-oauth2\lib\strategy.js:348:17) 
    at C:\FacebookExample\passport-facebook\examples\login\node_modules\passport-facebook\node_modules\passport-oauth2\lib\strategy.js:171:43 
    at C:\FacebookExample\passport-facebook\examples\login\node_modules\passport-facebook\node_modules\passport-oauth2\node_modules\oauth\lib\oauth2.js:177:18 
    at ClientRequest.<anonymous> (C:\FacebookExample\passport-facebook\examples\login\node_modules\passport-facebook\node_modules\passport-oauth2\node_modules\oauth\lib\oauth2.js:148:5) 
    at emitOne (events.js:77:13) 
    at ClientRequest.emit (events.js:169:7) 
    at TLSSocket.socketErrorListener (_http_client.js:259:9) 
    at emitOne (events.js:77:13) 
    at TLSSocket.emit (events.js:169:7) 
    at emitErrorNT (net.js:1253:8) 

кто-нибудь знает, как настроить код выше, чтобы пройти через корпоративный прокси-сервер для подключения? Я попытался установить свойства конфигурации npm прокси, http-proxy и https-proxy, но, похоже, это не имеет значения, когда я запускаю это приложение. Любая помощь, которую вы можете предложить, будет очень признательна. Спасибо.

ответ

2

Добавить этот код в /node_moduels/oauth/lib/oauth.js устранить проблему временно.

var HttpsProxyAgent = require('https-proxy-agent'); 
if (process.env['https_proxy']) { 
    httpsProxyAgent = new HttpsProxyAgent(process.env['https_proxy']); 
} 

Наконец, установите httpsProxyAgent к параметрам запроса перед _executeRequest вызывается так:

options.agent = httpsProxyAgent 
+0

Единственного oauth.js, что я мог бы найти находился в \ node_modules \ паспорта-facebook \ node_modules \ паспорт oauth2 \ node_modules \ OAuth \ Lib \ oauth.js. В коде отсутствует _executeRequest только метод _performSecureRequest. Это где вы должны поместить код HttpsProxyAgent, указанный выше? Кроме того, я не вижу объектов параметров для установки значения агента. Какой объект следует использовать? Спасибо. –

0

Добавление

options.agent = httpsProxyAgent 

работал для меня. Но я добавил его в $ workdir \ node_modules \ oauth \ lib \ oauth2.js как метод _executeRequest существует только там. Если у вас возникли проблемы с поиском _executeRequest я рекомендую делать полный поиск в node_modules\oauth, как я обнаружил, что метод в oauth2.js

Кроме того, не забывайте, что если вы используете API сторонних производителей, которые вы должны рассмотреть их. Я использую vkAPI SDK, который в основном представляет собой обертку поверх http_library с помощью удобных методов. В этом случае я бы предложил обернуть http_library звонки и украсить их для ваших нужд. Хороший способ начать здесь Anyway to set proxy setting in passportjs?

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