2017-07-18 64 views
0

我正在尝试进行用户身份验证,但我认为我的模板中出现了错误。当我用邮递员尝试时,它可以工作。首先,我要对/ users/authenticate进行API调用并获取令牌。然后,在获得令牌后,我会对/ users/me进行另一次API调用以验证它。它是成功的,在用户登录无法从模板获取数据并将其传递给控制器​​Angularjs

这是我的控制器:

.controller('homeCtrl', ['$rootScope', '$location', '$http', '$timeout', 'Auth', function ($rootScope, $location, $http, $timeout, Auth) { 
    $rootScope.loadme = false; 
    $rootScope.currentPa = $location.path(); 
    $rootScope.$on('$routeChangeStart', function() { 
     if (Auth.isLoggedIn()) { 
      console.log('Success: User is logged in'); 
      $rootScope.isLoggedIn = true; 
      Auth.getUser() 
       .then(function (data) { 
        $rootScope.username = data.data.username; 
        $rootScope.email = data.data.email; 
        $rootScope.loadme = true; 
       }); 
     } else { 
      $rootScope.isLoggedIn = false; 
      $rootScope.username = ''; 
      $rootScope.loadme = true; 
     } 
    }); 


    $rootScope.doLogin = function (loginData) { 
     $rootScope.loading = true; 
     $rootScope.errorMsg = false; 
     console.log("TEST LOGIN"); 

     Auth.doLogin($scope.loginData) 
      .then(function (data) { 
       console.log('logging in'); 
       if (data.data.success) { 
        console.log('fgsgsg'); 
        $rootScope.loading = false; 
        $rootScope.successMsg = data.data.message + 'Redirecting...'; 
        $timeout(function() { 
         console.log('12345'); 
         $location.path('/#!/'); 
         $rootScope.loginData = ''; 
         $rootScope.successMsg = false; 
        }, 2000); 
       } else { 
        console.log("no success"); 
        $rootScope.loading = false; 
        $rootScope.errorMsg = data.data.message; 
       } 
      }) 
    }; 

这些服务器的路由和中间件:

//User Login Route 
router.post('/authenticate', function (req, res) { 
User.findOne({username: req.body.username}) 
    .select('username email password') 
    .exec(function (err, user) { 
     if (err) { 
      throw err; 
     } 

     if (!user) { 
      res.json({success: false, message: 'Could not authenticate 
user'}); 
     } else if (user) { 
      if (req.body.password) { 
       var validPassword = 
user.comparePassword(req.body.password); 
      } 
      else { 
       res.status(200).json({success: false, message: 'Please 
provide password'}) 
      } 
      if (!validPassword) { 
       res.status(200).json({success: false, message: 'Could 
not authenticate password'}); 
      } else { 
       var token = jwt.sign({username: user.username, email: 
user.email}, secret, {expiresIn: '24h'}); 
       res.status(200).json({success: true, message: 'User 
authenticated', token: token}); 
      } 
     } 
     console.log(user); 
    }); 
}); 


//Middleware for decoding tokens 
router.use(function (req, res, next) { 
var token = req.body.token || req.body.query || req.headers['x-access- 
token']; 

if (token) { 
    jwt.verify(token, secret, function (err, decoded) { 
     if (err) { 
      res.json({success: false, message: 'Token Invalid'}) 
     } else { 
      req.decoded = decoded; 
      next(); 
     } 
    }); 
} else { 
    res.json({success: false, message: 'No token provided'}); 
} 
}); 

router.post('/me', function (req, res) { 
    res.send(req.decoded); 
}); 

最后,这是模板:

<div ng-controller="homeCtrl"> 
     <form ng-submit="doLogin(loginData)"> 
      <label>Username:</label> 
      <input class="form-control" type="text" name="username" placeholder="please enter username" 
        ng-model="loginData.username"> 
      <br> 
      <label>Email:</label> 
      <input class="form-control" type="text" name="email" placeholder="please enter email" 
        ng-model="loginData.email"> 
      <br> 
      <label>Password:</label> 
      <input class="form-control" type="password" name="password" placeholder="please enter password" 
        ng-model="loginData.password"> 
      <br> 
      <button class="btn btn-primary" type="submit" formmethod="post">Login</button> 
     </form> 
+1

您不需要在dologin函数中传递loginData。只需添加语句$ scope.loginData = {};到您的控制器并尝试在doLogin()中打印它,以便查看数据是否已登录到控制台。 – Kamesh

+0

它的工作。非常非常感谢你! – XhensB

回答

1

您不需要在dologin函数中传递loginData。只需添加语句$ scope.loginData = {};到您的控制器并尝试在doLogin()中打印它,以便查看数据是否已登录到控制台。

相关问题