2017-02-22 4 views
3

私の質問はthisと似ています。私はExpressバージョン4.14.0を使用しています。"passport-ping"モジュールを使用してOAuth2 SSOを実装しました。ログインに成功したリフレッシュトークンから新しいアクセストークンを取得するには、"passport-oauth2-refresh"モジュールを使用しています。これらのモジュールに問題はありません。期待どおりにすべてうまく動作します。しかし、問題はrequest.userオブジェクトにあります。以下は私のコードですNodeJS Express req [ユーザー]が複数リフレッシュ時に未定義

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 done関数は、以下のオブジェクトをreq.userに追加しています。私たちは持っているリフレッシュトークンのための新しいアクセストークンを取得するためにnewAccessToken機能を打って、新しいアクセストークンを持つreq.userオブジェクトを更新すると、以下のようにトークンを手動更新していますリクエストごとに

{ accessToken: accessToken, refreshToken: refreshToken } 

。 req ["user"]を更新する良い方法はありますか?

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

ユーザーがブラウザから継続的にリフレッシュすると、私はreq.userとして定義されていません。フォーラムを見ることでいくつかのことを試しましたが、うまくいきました。どんな助けでも大歓迎です。

+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); 
}); 
} 
関連する問題