当前位置:   C++ > 正文

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

javascript,asp.net-web-api,angularjs,asp.net-identity,asp.net,服务器,安全,https,json,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析,二维码生成,unix时间戳,在线开发工具,前端开发工具,开发人员工具,站长工具

我使用ASP.net Identity创建了一个承载令牌.在AngularJS中,我编写了这个函数来获取授权数据.

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

所以我想将此令牌存储到浏览器cookie中.如果此处存在此令牌,则获取令牌并从IIS服务器获取数据,否则重定向到登录页面以登录以获取新令牌.

同样,如果用户点击退出按钮,它应该从浏览器cookie中删除令牌.

这该怎么做 ?有可能吗?是验证和授权用户的正确方法吗?如果有多个用户令牌怎么办?



1> Boris..:

我建议不要将数据保存在cookie中,出于安全考虑,您应该将cookie设置为安全和HttpOnly(无法从javascript访问).如果您没有使用SSL,我建议您转到https.

我会在json响应中从auth端点传递令牌:

{
    tokenData: 'token'
}

您可以sessionStorage使用以下$window服务保存令牌数据:

$window.sessionStorage.setItem('userInfo-token', 'tokenData');

一旦用户关闭页面,它将被清除,您可以通过将其设置为空字符串来手动删除它:

$window.sessionStorage.setItem('userInfo-token', '');

编辑:

用于捕获数据的拦截器实现,改编自cbass(未经测试,您可以检查对象以获取响应/请求以提供信息):

//Create a http interceptor factory
function accessTokenHttpInterceptor($window) {
    return {
        //For each request the interceptor will set the bearer token header.
        request: function($config) {
            //Fetch token from cookie
            var token=$window.sessionStorage.getItem('userInfo-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.url === 'api/token' && response.config.data.tokenData) {
                  //fetch token
                  var token=response.config.data.tokenData;

                  //set token
                  $window.sessionStorage.setItem('userInfo-token', token);
            }
            return response;
        }
    };
}

accessTokenHttpInterceptor.$inject=['$window'];


将令牌保存在会话存储中还意味着如果我在新选项卡中打开链接,则会话存储中的令牌不可用.用户需要再次(在每个选项卡上)进行身份验证,这真的很烦人.可能的解决方案:http://stackoverflow.com/a/32766809/1878249

2> cbass..:

$cookiesAngularJS API中有一个使用该 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 ' },
    })
    .success(function (data) {
        $cookies.put('token', data);
    }).error(function () {
        alert("Failed :(");
    });
};

您还必须添加angular-cookies模块代码.并将其添加到您的角度应用程序:angular.module('myApp', ['ngCookies']);.Angular Cookies的文档.

我还想建议使用a Http interceptor来为每个请求设置承载头,而不是必须为每个请求自己手动设置.

//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 interceptor,您不需要Authorization header为每个请求设置.

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拦截器一起使用.只需将实现从cookie更改为localStorage即可.

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

    //get token
    var token=$window.localStorage['jwt'];
}
controller.$inject=['$window'];

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
  • 如何解决《是否可以直接在AzureWebApps中的Kestrel上运行ASP.NET5站点?》经验,为你挑选了2个好方法。azure-web-sites,dnx,kestrel-http-server,asp.net-core,asp.n... [详细]

  • 如何解决《C++中不区分大小写的字符串比较》经验,为你挑选了19个好方法。c++,string,算法,go,android,windows,安全,html,ios,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,js... [详细]

  • 如何解决《在Go中使用指针作为地图键是否安全?》经验,为你挑选了1个好方法。memory,garbage-collection,go,data-structures,安全,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工... [详细]

  • 如何解决《C++中的安全内存分配器》经验,为你挑选了4个好方法。c++,memory,security,ram-scraping,注入,windows,安全,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解... [详细]

  • 如何解决《单身人士:好的设计还是拐杖?》经验,为你挑选了11个好方法。language-agnostic,singleton,design-patterns,程序员,go,注入,安全,sql,DevBox,在线流程图,编程,编程问答,程序员... [详细]

  • 如何解决《Where子句的最佳实践》经验,为你挑选了1个好方法。haskell,design-patterns,functional-programming,where-clause,算法,go,安全,程序员,DevBox,在线流程图,编程... [详细]

  • 如何解决《Mono准备好迎接黄金时段吗?》经验,为你挑选了8个好方法。.net,mono,open-source,asp.net,sql,服务器,windows,linux,c#,apache,udp,ubuntu,https,git,ce... [详细]

  • 如何解决《华硕(自动启动管理员),miui(安全中心)的许可》经验,为你挑选了0个好方法。android,autostart,安全,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析,二维码生成,unix时... [详细]

  • 如何解决《ng-token-auth,ionic,devise_token_auth;令牌在xhr请求中随机丢失》经验,为你挑选了0个好方法。angularjs,cordova,ruby-on-rails-4,devise-token-au... [详细]

  • 如何解决《在条件前面添加条件?》经验,为你挑选了1个好方法。ruby-on-rails,devise,javascript,https,xss,安全,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析,二维... [详细]

  • 如何解决《使用看门狗和Tkinter》经验,为你挑选了1个好方法。python,user-interface,tkinter,python-3.x,安全,linux,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,j... [详细]

  • 如何解决《如何从AWSDynamoDB获得10ms以下的响应时间?》经验,为你挑选了1个好方法。amazon-web-services,amazon-dynamodb,json,安全,DevBox,在线流程图,编程,编程问答,程序员,开发者... [详细]

  • 如何解决《我如何开始编写自己的防火墙?》经验,为你挑选了2个好方法。language-agnostic,firewall,windows,算法,安全,linux,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,jso... [详细]

  • 如何解决《在函数参数中解构包含借位的结构》经验,为你挑选了0个好方法。struct,rust,borrow-checker,安全,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析,二维码生成,unix时间... [详细]

  • 如何解决《创建临时文件夹》经验,为你挑选了5个好方法。.net,io,vb,windows,安全,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析,二维码生成,unix时间戳,在线开发工具,前端开发工具,... [详细]

  • 如何解决《在Kotlin中,处理可空值,引用或转换它们的惯用方法是什么》经验,为你挑选了1个好方法。nullable,non-nullable,kotlin,安全,go,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具... [详细]

  • 如何解决《使用puma-dev获取本地的SSL/httpsforRails》经验,为你挑选了1个好方法。ruby-on-rails,keychain,puma,https,chrome,安全,rust,DevBox,在线流程图,编程,编程问... [详细]

  • 如何解决《如何在ASP.NETCoreIdentity中注销其他用户》经验,为你挑选了1个好方法。c#,asp.net-core-mvc,asp.net-core,asp.net-core-identity,安全,go,asp.net,De... [详细]

  • 如何解决《JWT身份验证和刷新令牌实现》经验,为你挑选了1个好方法。security,authentication,rest,jwt,json,安全,服务器,csrf,xss,ajax,html,DevBox,在线流程图,编程,编程问答,程... [详细]

  • 如何解决《如何将二进制数据转换为字符串并返回Java?》经验,为你挑选了2个好方法。java,serialization,xml,apache,安全,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析,二维... [详细]

相关标签
  

闽ICP备14008679号