加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

angularjs – 身份验证返回“401(未授权)”时不应该返回

发布时间:2020-12-17 07:12:47 所属栏目:安全 来源:网络整理
导读:我第一次设置了身份验证功能,并且在用户登录后得到了一些意想不到的结果.一位同事给了我一个带有工作身份验证的应用程序来模拟我的应用程序,看起来我所做的一切都是正确的. 我在前端,SailsJS后端框架和PassportJS身份验证中间件上使用AngularJS. 我的源代码(
我第一次设置了身份验证功能,并且在用户登录后得到了一些意想不到的结果.一位同事给了我一个带有工作身份验证的应用程序来模拟我的应用程序,看起来我所做的一切都是正确的.

我在前端,SailsJS后端框架和PassportJS身份验证中间件上使用AngularJS.

我的源代码(现在)公开存储…后端API在Github上(API Github),前端代码在这里找到(Front-End Github)

基本上发生的是用户

>点击登录按钮,触发此功能

login: function (credentials) {
    return baseAuth.customPOST(credentials,'login').then(function (user) {
        $log.debug('User logged in: ',user);
        isAuthenticated = true;
        return user;
    });
},

>该customPOST的控制器逻辑就是这个

login: function (req,res,next) {
   passport.authenticate('local',function (err,user,info) {
       if (err) { return res.json(err); }
       else if (user) {
           req.logIn(user,function (err) {
               if (err) { return res.json(err); }
               return res.json(user);
           });
       } else { return res.json(400,info); }

   })(req,res);

},

>在该步骤中,护照应该做它的事情并登录用户

passport.use(new LocalStrategy({ usernameField: 'email',passwordField: 'password' },function(email,password,next) {
   User.findOne({ email: email })
       .exec(function (err,user) {
           if (err) { return next(err); }
           if (user) {
                if (user.activated) {
                bcrypt.compare(password,user.password,valid) {
                    if (err) { next(err); }
                    if (valid) {
                        return next(null,{ message: 'Logged In' });
                    } else { return next(null,false,{ message: 'Incorrect password'}); }
                });
            } else { next(null,{ message: 'User is not activated. Please contact admins.'}); }
        } else { next(null,{ message: 'Could not find user with email ' + email }); }
    });
   }
 ));

在控制台中,我总是认为这是成功的.

控制台读取:

User logged in:  Object {firstName: "John",lastName: "Doe",email: "john_doe@work.com",activated: true,isUser: true…}

>然后,我对发生的事情的理解变得有些模糊.我知道应用程序然后尝试查看用户是否经过身份验证. IsAuthenticated被触发,在AngularJS中看起来像这样:

isAuthenticated: function (force) {
    var deferred = $q.defer();

    if (isAuthenticated && currentUser) {
        deferred.resolve(currentUser);
    } else {
        return baseAuth.customGET('authenticated').then(function (user) {
            deferred.resolve(currentUser);
            isAuthenticated = true;
            currentUser = user;
            return user;
        });
    }

    return deferred.promise;
}

>它在后端UserController中执行此操作

isAuthenticated: function (req,res) {
   if (req.isAuthenticated() && req.user.isUser) { return res.json(req.user); }
   else { return res.send(401); }
},

然后它失败了:( GET http:// localhost:1337 / user / authenticated 401(Unauthorized)req.isAuthenticated和req.user.isUser都没有通过.我把它们分开来单独测试,但它们都不是真的.“isUser “是一个我默认为true的值,因此对于db中的每个用户都应该是真的.req.isAuthenticated也失败了,我不完全理解.

有人对我的问题有所了解吗?我在这里做错了什么?

解决方法

如果您的前端应用程序与后端应用程序 the AJAX requests will not include the session cookie的来源不同,则req.isAuthenticated()将永远不会返回true.

使用withCredentials选项强制它.

$http({ withCredentials: true,... })

似乎Restangular使用相同的选项:

https://github.com/mgonto/restangular#setdefaulthttpfields

https://docs.angularjs.org/api/ng/service/$http#usage

编辑:您还应该按照idbehold的指示检查the server side configuration

正如Matan所建议的那样,你应该尝试在服务器端使用sails-generate-auth生成器.

https://github.com/sails101/even-more-passport

https://github.com/kasperisager/sails-generate-auth

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读