【问题标题】:Angularjs no token in the HeaderAngularjs在标头中没有标记
【发布时间】:2017-05-02 02:00:51
【问题描述】:

我不明白某些东西或遗漏了一些我认为的东西。 我有一个 LoginPage 来授权用户(即 Angularjs 1.5) 作为后端,我有一个验证用户和密码的 Scala/Play 应用程序 所以现在我遇到了登录服务中一切正常的问题

        var token = $cookies["XSRF-TOKEN"];
        if (token) {
            $http.get('http://localhost:9000/ping')
                .then(
                    function (response) {
                        return $http.get("http://localhost:9000/users/" + response.data.userId)
                    }, function (response) {
                        token = undefined;
                        $cookies["XSRF-TOKEN"] = undefined;
                        return $q.reject("Token invalid");
                    }
                    ).then(
                        function (response) {
                            console.log(response.data);
                        }, function (response) {
                    console.log("error");
                }
            );
        }
        $http.post('http://localhost:9000/login', user)
            .then(function (response) {
            token = response.data.authToken;
            console.log(token);
            var userId = response.data.userId;
            return $http.get('http://localhost:9000/users/' +  userId)
        }, function (response) {
                console.log(response.data.err);
                // return 'empty' promise so the right `then` function is called
                return $q.reject("Login failed");
            }).then(
            function (response) {
                console.log(response);
            }
        )
    }

当我现在想登录时,登录一切正常

但在下一种情况下,我向 api 发送了一个 get 请求并想要检查 xsrf cookie 但没有发送任何 cookie。

这是 Scala 中的安全特性 -

    def HasToken[A](p: BodyParser[A] = parse.anyContent)(f: String => Long => Request[A] => Result): Action[A] =
Action(p) { implicit request =>
  val maybeToken = request.headers.get(AuthTokenHeader).orElse(request.getQueryString(AuthTokenUrlKey))
  maybeToken flatMap { token =>
    cache.get[Long](token) map { userid =>
      f(token)(userid)(request)
    }
  } getOrElse Unauthorized(Json.obj("err" -> "No Token"))
}

所以现在我的问题是 - 标头令牌在哪里?

更新: 这是我的 app.js

    'use strict';

    function testInterceptor($rootScope, $q, $timeout) {
    return function(promise) {
        return promise.then(
            function(response) {
                return response;
            },
            function(response) {
                if (response.status == 401) {
                    $rootScope.$broadcast("InvalidToken");
                    $rootScope.sessionExpired = true;
                    $timeout(function() {$rootScope.sessionExpired = false;}, 5000);
                } else if (response.status == 403) {
                    $rootScope.$broadcast("InsufficientPrivileges");
                } else {
                    // Here you could handle other status codes, e.g. retry a 404
                }
                return $q.reject(response);
            }
        );
    };
}

var app=angular.module('telephone', ['ngRoute', 'ngCookies']);
app.factory('testInterceptor', testInterceptor);
app.config(["$httpProvider", "$routeProvider",function ($httpProvider, $routeProvider) {

    $httpProvider.interceptors.push('testInterceptor');

    $routeProvider.when('/login', {templateUrl: '../partials/login.html', controller: 'loginController'});
    $routeProvider.otherwise({redirectTo: '/login'});
}]);

【问题讨论】:

  • 您的 Angular 应用程序是否在 localhost 域上运行,或者您如何在浏览器中访问它?询问是因为它们必须匹配,否则 angular/javascript 将看不到 cookie,
  • 两者都运行在 localhost (angularjs localhost:8000, scala Backend localhost:9000)

标签: angularjs scala cookies csrf access-token


【解决方案1】:

我认为您需要在下一个请求的默认标头中添加令牌,以便您可以像这样添加

function SetCredentials(user) {
                $http.defaults.headers.common["Authorization"] = 'Bearer ' + user.access_token;
               //Here Token added in header
                $rootScope.globals = {
                    currentUser: {
                        username: user.userName,
                        authdata: user.access_token,
                        userid: user.userId,
                    }
                };

                $cookieStore.put('globals', $rootScope.globals);
                setUsers(user)
            };

【讨论】:

  • 嗯,SetCredentials 没有成功
  • 不使用 SetCredentials 仅使用默认标头在标头中添加令牌
  • 你说得对,我设置了标题,一切看起来都不错
猜你喜欢
  • 2017-02-16
  • 2016-11-28
  • 1970-01-01
  • 2016-08-12
  • 1970-01-01
  • 2016-07-14
  • 2014-02-01
  • 1970-01-01
相关资源
最近更新 更多