javascript - Menolak data pengguna dari pelayan Nodejs ke Angular selepas log masuk berjaya
Saya cuba untuk log masuk pengguna saya melalui Facebook menggunakan PassportJS dan menghantar data pengguna kepada Angular. Di pihak pelayan semuanya kelihatan ok dengan kod berikut untuk callback Facebook dalam pengawal pengguna:
exports.facebookCallback = function() {
return function(req, res, next) {
passport.authenticate('facebook', function(err, user, email) {
if (err || !user) {
return res.redirect('/auth');
}
req.login(user, function(err) {
if (err) {
return res.redirect('/auth');
}
return res.redirect('/');
});
})(req, res, next);
};
};
Daripada apa yang saya faham daripada dokumen PassportJS, memanggil req.login sepatutnya meletakkan data pengguna ke dalam sesi.
Rute saya di sisi pelayan kelihatan seperti berikut:
app.get('/auth', usersCtrl.auth);
app.get('/auth/signout', usersCtrl.logout);
app.get('/auth/facebook', passport.authenticate('facebook', {
scope: ['email', 'user_hometown']
}));
app.get('/auth/facebook/callback', usersCtrl.facebookCallback());
konfigurasi ekspres dan pasport termasuk:
app.use(express.cookieParser());
app.use(express.session({secret: '1234567890QWERTY'}));
app.use(express.bodyParser());
app.use(passport.initialize());
app.use(passport.session());
Sekarang di sisi Angular, saya cuba mendapatkan data pengguna dari sesi dalam perkhidmatan yang ditakrifkan seperti ini:
module.exports = require('angular')
.module('HomeModule', [])
.controller('HomeCtrl', function ($scope) {
//home controller code ors here
}).controller('NavbarCtrl', ['$scope', 'Authentication', function ($scope, Authentication) {
$scope.authentication = Authentication;
//rest of the navbar controller goes here
}]).factory('Authentication', [
function() {
var _this = this;
_this._data = {
user: window.user
};
return _this._data;
}
]);
Malangnya, data pengguna tidak tersedia di window.user di pihak angular. Ada idea apa yang saya lakukan salah di sini?
Jawapan #1
Seperti yang dikatakan oleh Girish, objek sesi pasport tidak akan tersedia di sisi klien. Oleh kerana anda nampaknya menggunakan express, cara mudah untuk melakukan ini adalah dengan menggunakan express-expose.
Jika anda ingin data pengguna tersedia di semua halaman apabila pengguna disahkan, anda boleh menambah sesuatu seperti ini sebelum pernyataan laluan anda
app.use(function (req, res, next) {
if (req.isAuthenticated()) res.expose(req.user, 'user');
next ();
});
Data pengguna akan tersedia di pihak klien sebagai window.user.
Jawapan #2
Objek sesi passport tidak akan tersedia pada objek window, sebaliknya anda perlu mendapatkannya dari server menggunakan beberapa perkhidmatan atau URL pengalihan.
Selepas pengesahan berjaya, fungsi laluan utama akan dipanggil, yang, dalam kes ini, akan mengalihkan pengguna ke halaman utama.
app.get('/auth/facebook/callback',
passport.authenticate('facebook', { failureRedirect: '/login' }),
function(req, res) {
res.redirect('/');
});
app.get('/', function(req, res){
res.render('index', { user: req.user });
});
atau anda boleh membuat laluan untuk mendapatkan data pengguna yang log masuk
app.get('/account', function(req, res){
if (req.isAuthenticated()) {
res.send({user : req.user});
}else{
res.redirect('/login');
}
});
Di pihak Angular, anda boleh menetapkan data pengguna ke rootscope dari respons $http,
$rootScope.session = {}
$rootScope.session.user = res.user;
