用户无法使用 JWT 和 Node API 登录 Angular js

Posted

技术标签:

【中文标题】用户无法使用 JWT 和 Node API 登录 Angular js【英文标题】:User cannot login in Angular js with JWT and Node API 【发布时间】:2017-02-03 16:34:11 【问题描述】:

我正在为用户登录创建一个 Node api,并正在使用 JSON Web Token 进行身份验证。

apiRoutes.put('/login', function(req, res)
  User.findOne(name:req.body.name, function(err, user)
    if(err)throw err;
    else
      if(!user)
        res.send(success:false, msg:'Auth Failed');
      else
        user.comparePassword(req.body.password, function(err, isMatch)
          if(isMatch && !err)
            var token=jwt.encode(user, config.secret);
            res.json(success:true, token:'JWT' +token);
          else
            res.send(success:false, msg:'Auth Fails:wrong password');
          
        );
      
    
  );
);

登录控制器

app.controller('loginCtrl', function($http, $scope, $location, $cookieStore)

 $scope.login=function() 
    console.log($scope.loginUser);
    $http.put('/api/login', $scope.loginUser).then(function(response)

        console.log(response.data.token); 
        $cookieStore.put('token',response.data.token);
        $scope.currentUser=$scope.loginUser.name;  
        alert("Successfully Loggedin");

       , function(err)
       alert('Bad Login Credentials');
      );

      ;
    );

登录表单 HTML

<div class="post" ng-controller="loginCtrl">  
        <form method="post">
          <div class="form-group" >
          <label>Name</label>
          <input type="text" class="form-control" name="name" ng-model="loginUser.name" />
        </div>
        <div class="form-group">
          <label>Password</label>
          <input type="password" class="form-control" name="password" ng-model="loginUser.password"/>
        </div>
        <div class="form-group">
          <button class="btn btn-success" ng-click="login()" >Login</button>
        </div>
        </form>

      </div>

问题是,当我使用用户凭据单击登录按钮时,它总是返回alert("successfully logged in");,尽管用户凭据是对还是错。我认为 Angular Login 控制器中缺少某些内容,但我无法找出错误。

有人可以帮我找出问题吗?

谢谢。

【问题讨论】:

【参考方案1】:

当您发送错误响应时,请尝试发送 http 状态代码作为响应。只是尝试发送

res.send(400, success:false, msg:'Auth Failed');

【讨论】:

with express 4 使用 res.status(400).send(success:false, msg:'Auth Failed'); 如果用户 namepassword 都错了,那么它会显示正确的警报消息。但是当user 匹配和password 不匹配时,它总是返回alert("successfully loggedin") 然后检查你的 comparePassword 函数。 下面是我的比较密码功能,似乎没有什么错误。 UserSchema.methods.comparePassword = function (passw, cb) bcrypt.compare(passw, this.password, function (err, isMatch) if (err) return cb(err); cb(null, isMatch); ); ;

以上是关于用户无法使用 JWT 和 Node API 登录 Angular js的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有用户和登录的情况下使用 JWT?

JWT 在 Node.JS 中无法正常工作

如何在 Vuejs 和 Node 中设置授权标头并保护路由

Next.js 使用 JWT 进行身份验证

如何保护简单的 Node.js RESTful API

使用 JWT 的 API 客户端身份验证 — Node/TypeScript