当前位置: 首页 > 知识库问答 >
问题:

如何使用AngularJS在浏览器cookie中存储认证承载令牌

萧伟兆
2023-03-14

我已经使用ASP.NET标识创建了承载令牌。在AngularJS中,我编写了这个函数来获取授权数据。

$scope.GetAuthorizeData = function () {
  $http({
    method: 'GET',
    url: "/api/Values",
    headers: { 'authorization': 'bearer <myTokenId>' },
  }).success(function (data) {
    alert("Authorized :D");
    $scope.values = data;
  }).error(function () {
    alert("Failed :(");
  });
};

所以我想把这个令牌存储到浏览器cookie中。如果该令牌存在于此,则获取该令牌并从IIS服务器获取数据,否则重定向到登录页以登录获取新令牌。

类似地,如果用户单击注销按钮,它应该从浏览器cookie中删除令牌。

这怎么做?有可能吗?对用户进行身份验证和授权是正确的方式吗?如果有多个用户令牌怎么办?

共有1个答案

严阳成
2023-03-14

AngularJS API中有一个$cookies服务,使用ngcookies模块。它可以像下面这样使用:

function controller($cookies) {
    //set cookie
    $cookies.put('token', 'myBearerToken');

    //get cookie
    var token=$cookies.get('token');

    //remove token
    $cookies.remove('token');
}
controller.$inject=['$cookies'];

对于您的情况,应该是:

//inject $cookies into controller
$scope.GetAuthorizeData = function () {
    $http({
        method: 'GET',
        url: "/api/Values",
        headers: { 'authorization': 'bearer <myTokenId>' },
    })
    .success(function (data) {
        $cookies.put('token', data);
    }).error(function () {
        alert("Failed :(");
    });
};

您还必须添加angular-cookies模块代码。并将其添加到您的angular应用程序:angular.module('my app',['ng cookies']);。角饼干的文档。

我还建议使用HTTP拦截器,它将为每个请求设置承载头,而不必为每个请求自己手动设置。

//Create a http interceptor factory
function accessTokenHttpInterceptor($cookies) {
    return {
        //For each request the interceptor will set the bearer token header.
        request: function($config) {
            //Fetch token from cookie
            var token=$cookies.get['token'];

            //set authorization header
            $config.headers['Authorization'] = 'Bearer '+token;
            return $config;
        },
        response: function(response) {
            //if you get a token back in your response you can use 
            //the response interceptor to update the token in the 
            //stored in the cookie
            if (response.config.headers.yourTokenProperty) {
                  //fetch token
                  var token=response.config.headers.yourTokenProperty;

                  //set token
                  $cookies.put('token', token);
            }
            return response;
        }
    };
}
accessTokenHttpInterceptor.$inject=['$cookies'];

//Register the http interceptor to angular config.
function httpInterceptorRegistry($httpProvider) {
    $httpProvider.interceptors.push('accessTokenHttpInterceptor');
}
httpInterceptorRegistry.$inject=['$httpProvider'];

//Assign to module
angular
    .module('myApp')
    .config(httpInterceptorRegistry)
    .factory('accessTokenHttpInterceptor', accessTokenHttpInterceptor)

有了HTTP拦截器,您就不需要为每个请求设置Authorization头

function service($http) {
    this.fetchToken=function() {
        //Authorization header will be set before sending request.
        return $http
            .get("/api/some/endpoint")
            .success(function(data) {
                 console.log(data);
                 return data;
            })
    }
}
service.$inject=['$http']

正如鲍里斯所说:还有其他方法可以解决这个问题。您还可以使用localstorage来存储令牌。这也可以与http拦截器一起使用。只需将实现从cookies更改为LocalStorage即可。

function controller($window) {
    //set token
    $window.localStorage['jwt']="myToken";

    //get token
    var token=$window.localStorage['jwt'];
}
controller.$inject=['$window'];
 类似资料:
  • 问题内容: 我已经使用ASP.net Identity创建了承载令牌。在AngularJS中,我编写了此函数以获取授权数据。 所以 我想将此令牌存储到浏览器cookie中 。如果此令牌存在,则获取令牌并从IIS服务器获取数据,否则重定向到登录页面以登录以获取新令牌。 同样,如果用户单击注销按钮,则应从浏览器cookie中删除令牌。 这该怎么做 ? 有可能吗?验证和授权用户的正确方法吗?如果有多个用

  • 我第一次使用JSON Web令牌(JWT)。我正在制作一个节点。js应用程序。我想使用JWT进行身份验证。根据文档,我将JSON令牌返回到前端。 但是我不知道如何将这个JSON令牌保存到我的浏览器头中,这样它就不会丢失,并随头一起再次发送到后端。如何将它保存在我的浏览器存储中,并在每次向后端发送请求时将其添加到请求头中?

  • 问题内容: 我是angularjs的新手。如何在angularjs中检测到userAgent。可以在控制器中使用它吗?尝试了以下类似的方法,但是没有运气! 我需要专门检测IE9! 问题答案: 就像Eliran Malka询问的那样,为什么需要检查IE 9? 检测浏览器的品牌和版本通常是一种难闻的气味。通常,这意味着如果您需要JavaScript来检测特定版本的浏览器,则代码会有更大的问题。 在某些

  • 我是新的angularjs。我怎么能检测用户代理在angularjs。有可能在控制器中使用它吗?尝试了下面这样的东西,但没有运气! 我需要专门检测IE9!

  • 是否可以使用来自Google API客户端Javascript库的承载令牌来授权Google云存储桶,而无需向用户请求https://www.googleapis.com/auth/devstorage范围。该桶具有对所有Google帐户的读写访问权限。

  • 当一个人试图使用azure AD承载令牌访问我们的系统时,这个获取和缓存资源令牌的工作流程是不存在的。 所以我的问题是,我如何使用承载令牌来启用它?如何才能像使用OpenIDConnect一样请求额外的资源令牌?是否可以使用ADAL从承载令牌获取授权代码?