2017-02-22 33 views
3

Мой вопрос похож на this. Я использую экспресс-версию 4.14.0, и я внедрил OOuth2 SSO с использованием «паспорт-пинг». Для получения нового токена доступа из токена обновления, который у нас есть при успешном входе в систему, я использую модуль «passport-oauth2-refresh». Нет проблем с этими модулями. Все работает нормально, как ожидалось. Но проблема связана с объектом request.user. Ниже мой кодNodeJS Express req [пользователь] undefined при множественном обновлении

var express = require('express'); 
var async = require('async'); 
var cookieParser = require('cookie-parser'); 
var request = require('request'); 
var passport = require('passport'); 
var OAuth2Strategy = require('passport-ping').Strategy; 
var refresh = require('passport-oauth2-refresh'); 
var session = require('express-session'); 
var bodyParser = require('body-parser'); 
var Client = require('node-rest-client').Client; 
var client = new Client(); 
var _outputpath = "/build", 
_templatePath = "./templates"; 

var app = express(); 

app.use(express.static(__dirname + "/")); 
app.use(cookieParser()); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: true })); 
app.use(session({ 
secret: "session secret", 
resave: true, 
saveUninitialized: true 
})); 
app.use(passport.initialize()); 
app.use(passport.session()); 

var port = process.env.port || 8080; 

// Allow cross orgin 
app.all('*', function (req, res, next) { 
res.setHeader('Access-Control-Allow-Origin', '*'); 
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE'); 
res.setHeader('Access-Control-Allow-Headers', 'Origin, Content-Type, X-Auth-Token'); 
res.setHeader('Access-Control-Allow-Credentials', true); 
if (req.method === 'OPTIONS') { 
    res.status(200); 
    res.end(); 
} else { 
    next(); 
} 
}); 

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

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

var strategy = new OAuth2Strategy({ 
authorizationURL: 'xxx', 
tokenURL: 'xxx', 
clientID: 'xxx', 
clientSecret: 'xxx', 
callbackURL: 'http://localhost:8080' 
}, 
function (accessToken, refreshToken, profile, done) { 
    done(null, { accessToken: accessToken, refreshToken: refreshToken }); 
} 
); 

passport.use('oauth-provider', strategy); 
refresh.use('oauth-provider', strategy); 

var isAuthenticated = function (req, res, next) { 
if (req.isAuthenticated()) { 
    return next(); 
} else { 
    res.redirect('/'); 
} 
} 

/***************** GET BASE PAGE ************/ 
app.get('/guide', isAuthenticated, function (req, res) { 
async.series({ 
    one: function (callback) { 
    newAccessToken(req, res, true, function (reqQuery) {   
     var _reqQuery = reqQuery; 
     res.cookie('userAccessToken', req["user"].refreshToken, { maxAge: 1 * 24 * 3600000, httpOnly: false }); 
     res.sendFile(__dirname + _outputpath + '/index.html'); 
     callback(null, req["user"]); 
    }) 
    }, 
    two: function (callback) { 
    callback(null, 2); 
    } 
}, 
    function (err, results) { 
    console.log('Completed Guide Page'); 
    }); 
}); 

app.get('/', passport.authenticate('oauth-provider', { 
successRedirect: '/guide', 
failureRedirect: '/error', 
pfidpadapterid: 'OAuthAdapterCCDS' 
}) 
); 

function newAccessToken(req, res, isParent, callback) { 
refresh.requestNewAccessToken('oauth-provider', req["user"].refreshToken, function (err, accessToken, refreshToken) { 
    var expireAccessToken = new Date(); 
    expireAccessToken.setMinutes(expireAccessToken.getMinutes() + 59); 
    req["user"].refreshToken = refreshToken; 
    req["user"].accessToken = accessToken; 
    req["user"].accessTokenTime = new Date(); 
    req["user"].expireAccessToken = expireAccessToken; 
    callback(req); 
}); 
} 

/***************** START THE SERVER ************/ 
app.listen(port, function() { 
console.log('Server started & listening on port: ' + port); 
}); 

После успешной Войти OAuth2Strategy сделали функцию добавления ниже объекта req.user.

{ accessToken: accessToken, refreshToken: refreshToken } 

На каждом запросе я ударяя newAccessToken функцию, чтобы получить новый маркер доступа для обновления маркеров у нас есть и обновление объекта req.user с новым маркерами доступа и обновить маркер вручную, как показано ниже. Есть ли лучший способ обновить req ["user"]?

req["user"].refreshToken = refreshToken; 
req["user"].accessToken = accessToken; 
req["user"].accessTokenTime = new Date(); 
req["user"].expireAccessToken = expireAccessToken; 

Если пользователь постоянно обновляется из браузера, я получаю as req.user undefined. Пробовал несколько вещей, видя форум, но он работал. Буду признателен за любую оказанную помощь.

+0

Любое обновление? Я столкнулся с подобной любопытной ситуацией –

+0

@PsycheGenie В моем случае я неправильно обработал ошибку, которая является причиной проблемы, с которой я столкнулся – ShaMoh

ответ

1

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

function newAccessToken(req, res, isParent, callback) { 
refresh.requestNewAccessToken('oauth-provider', req["user"].refreshToken, function (err, accessToken, refreshToken) { 
    var expireAccessToken = new Date(); 
    expireAccessToken.setMinutes(expireAccessToken.getMinutes() + 59); 
    req["user"].refreshToken = refreshToken; 
    req["user"].accessToken = accessToken; 
    req["user"].accessTokenTime = new Date(); 
    req["user"].expireAccessToken = expireAccessToken; 
    callback(req); 
}); 
} 

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

  • Нет связанных вопросов^_^