Ich baue meine erste Full-Stack-MEAN-Anwendung, aber ich folgte einem alten Tutorial, aber eine neuere npm-Pakete verwendet, so dass einige meiner Code nicht funktioniert. Ich baue gerade eine Login/App. Mein Programm ist gut in der Registrierung eines Benutzers, speichert es, wenn der Benutzer nicht registriert wurde, und leugnet es, wenn es bereits vorhanden ist. Aber wenn ich mich anmelde, sollte es die Winkelansicht ändern, um eingeloggt zu sein, und eine Abmelde-Schaltfläche hinzufügen, aber das scheint es nicht zu tun.Login auf Passport.js nicht auf Angular aktualisieren
Ich habe Hashbang auf meinem HTML verwendet, muss ich etwas anderes in meinem Code ändern?
Hier ist der Quellcode für die Winkel App
app.controller('authController', function($scope, $http, $rootScope, $location){
$scope.user = {username: '', password: ''};
$scope.error_message = '';
$scope.login = function(){
$http.post('/auth/login', $scope.user).then(function(data){
if(data.state == 'success'){
$rootScope.authenticated = true;
console.log('user is now authenticated'); // not printing
$rootScope.current_user = data.user.username;
console.log('user is now logged in');
$location.path('/');
console.log('view is updated');
}
else{
$scope.error_message = data.message;
}
});
};
$scope.register = function(){
$http.post('/auth/signup', $scope.user).then(function(data){
if(data.state == 'success'){
$rootScope.authenticated = true;
console.log('user is now authenticated'); //this is not printing
$rootScope.current_user = data.user.username; //accessing mongodb
console.log('user is now logged in');
$location.path('/');
console.log('view is updated');
}
else{
$scope.error_message = data.message;
}
});
};
});
Hier ist die Quelle für die Authentifizierung Route
var express = require('express');
var router = express.Router();
var bodyParser = require('body-parser');
module.exports = function(passport){
//sends successful login state back to angular
router.get('/success', function(req, res){
res.send({state: 'success', user: req.body.user ? req.body.user : null});
console.log('successfully login');
});
//sends failure login state back to angular
router.get('/failure', function(req, res){
res.send({state: 'failure', user: null, message: "Invalid username or password"});
console.log('username/password does not exist in database');
});
//log in
router.post('/login', passport.authenticate('login', {
successRedirect: '/auth/success',
failureRedirect: '/auth/failure'
}));
//sign up
router.post('/signup', passport.authenticate('signup', {
successRedirect: '/auth/success',
failureRedirect: '/auth/failure'
}));
//log out
router.get('/signout', function(req, res) {
req.logout();
res.redirect('/');
});
return router;
}
UPDATE:
Ist es vielleicht etwas mit PassportJS zu tun?
var mongoose = require('mongoose');
var User = mongoose.model('User');
var LocalStrategy = require('passport-local').Strategy;
var bCrypt = require('bcrypt-nodejs');
module.exports = function(passport){
// Passport needs to be able to serialize and deserialize users to support persistent login sessions
passport.serializeUser(function(user, done) {
console.log('serializing user:',user.username);
done(null, user._id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
console.log('deserializing user:',user.username);
done(err, user);
});
});
passport.use('login', new LocalStrategy({
passReqToCallback : true
},
function(req, username, password, done) {
// check in mongo if a user with username exists or not
User.findOne({ 'username' : username },
function(err, user) {
// In case of any error, return using the done method
if (err)
return done(err);
// Username does not exist, log the error and redirect back
if (!user){
console.log('User Not Found with username '+username);
return done(null, false);
}
// User exists but wrong password, log the error
if (!isValidPassword(user, password)){
console.log('Invalid Password');
return done(null, false); // redirect back to login page
}
// User and password both match, return user from done method
// which will be treated like success
return done(null, user);
}
);
}
));
passport.use('signup', new LocalStrategy({
passReqToCallback : true // allows us to pass back the entire request to the callback
},
function(req, username, password, done) {
// find a user in mongo with provided username
User.findOne({ 'username' : username }, function(err, user) {
// In case of any error, return using the done method
if (err){
console.log('Error in SignUp: '+err);
return done(err);
}
// already exists
if (user) {
console.log('User already exists with username: '+username);
return done(null, false);
} else {
// if there is no user, create the user
var newUser = new User();
// set the user's local credentials
newUser.username = username;
newUser.password = createHash(password);
// save the user
newUser.save(function(err) {
if (err){
console.log('Error in Saving user: '+err);
throw err;
}
console.log(newUser.username + ' Registration succesful');
return done(null, newUser);
});
}
});
})
);
var isValidPassword = function(user, password){
return bCrypt.compareSync(password, user.password);
};
// Generates hash using bCrypt
var createHash = function(password){
return bCrypt.hashSync(password, bCrypt.genSaltSync(10), null);
};
};
Jede Hilfe oder allgemeiner Zeiger wird geschätzt. Vielen Dank!
Scheint nicht, als ob dies mit Winkel verbunden ist. Was ist das Problem Client-Seite? – Phix
Ich benutze Hashbang, vielleicht war es das? Ich habe einen Teil des obigen Quellcodes aktualisiert, es scheint, dass er mich nicht umleitet, wenn ich $ location.path ('/') anrufe; – blueblood
Ich benutze Hashbang vielleicht das ist es? @Phix denke nicht, dass die Sachen, die ich unter $ scope.register und $ scope.login habe, ausgeführt werden. – blueblood