logout() 在使用 passport.js、express.js、AngularJs 时不起作用

Posted

技术标签:

【中文标题】logout() 在使用 passport.js、express.js、AngularJs 时不起作用【英文标题】:logout() not working using passport.js, express.js, AngularJs 【发布时间】:2016-02-26 06:09:03 【问题描述】:

我猜我没有足够的睡眠,无法弄清楚。 跟随web登录在线示例,登录按钮有效,但注销按钮无效,server.js中未调用注销。

非常感谢!

app.config(['$routeProvider',
    function($routeProvider) 
        $routeProvider.when('/login', 
            templateUrl: '/partials/login.html',
            controller:  'authController'
        );
        $routeProvider.when('/logout', 
            templateUrl: '/partials/logout.html',
            controller:  'authController',
        );
    ...
);

app.controller('authController', function($scope, $http, $location, $window) 
    $scope.user = username:'', password:'';
    $scope.alert = '';

    $scope.login = function(user) 
        $http.post('/auth/login', user).
            success(function(data) 
                console.log("you are at /auth/login 0");
                $scope.loggedUser = data;
                $window.location.href = "/index.html#/systemStatus";
            ).
            error(function() 
                console.log("you are at /auth/login 1");
                $scope.alert = 'Login failed'
            );
    ;

    $scope.logout = function() 
        $http.get('/auth/logout').
            success(function() 
                console.log("you are at /auth/logout 0");
                $scope.loggedUser = ;
            ).
            error(function() 
                console.log("you are at /auth/logout 1");
                $scope.alert = 'Logout failed'
            );
    ;
);

login.html(这是默认页面,总是需要第一次登录)

<div  ng-controller="authController">
    <div style="margin-top:10px" class="form-group">
        <div class="col-sm-12 controls">
            <a id="btn-login" class="btn btn-success" ng-click="login(user)">Login </a>
        </div>
    </div>
</div>

main.html(这是登录成功后的第一页)

<html ng-app="myModule" ng-controller="MainCtrl">
    ...
    <div class="container" ng-controller="authController">
        <a class="btn btn-md btn-info custom-btn" ng-href="#/logout">Logout</a>
    </div>
    ...
</html>

server.js

app.get('/auth/logout', function(req, res) 

    console.log("logging out ......");
    req.session.distory();
    req.logout();
    //res.redirect('/login.html');
    res.send(200);
);

【问题讨论】:

看我的回答***.com/a/43429283/2077479 【参考方案1】:

你拼错了destroy:

req.session.destroy();

不是

req.session.distory();

【讨论】:

【参考方案2】:

使用

    req.logout();
    req.session.destroy();
    res.redirect("/login");

我在我的 nodejs 应用程序中使用它并且它工作正常。

【讨论】:

【参考方案3】:

问题是发生角度路由而不是快速路由。要让 express 路由请求,您需要在注销链接的锚标记中添加 target="_self"。

<a class="btn btn-md btn-info custom-btn" ng-href="#/logout" target="_self">Logout</a>

【讨论】:

【参考方案4】:

您需要通知浏览器刷新登录信息。这可以通过发送 401 错误代码来完成。

app.get('/auth/logout', function(req, res) 

    console.log("logging out ......");
    req.logout();
    res.send(401);
);

.

【讨论】:

以上是关于logout() 在使用 passport.js、express.js、AngularJs 时不起作用的主要内容,如果未能解决你的问题,请参考以下文章

passport.js 使用sails.js 验证弹出窗口

如何正确使用 Passport.js?

如何在 passport-facebook / Passport.js 中捕获 FacebookAuthorizationError?

如何使用 Passport.js 在 Node.js 中重置/更改密码?

如何使用 Passport.js 访问 Cookie 集

仍然需要使用带有 passport.js 的 cookie-parser 吗?