首页 文章

我可以将响应标记传递给响应头中的Angular JS应用吗?

提问于
浏览
1

由于各种原因,我需要使用服务器技术,在这种情况下ASP.Net来渲染我的Angular JS应用程序 . 因此,当用户请求索引页面时,请求将通过ASP.Net管道,该管道将为应用程序提供脚本,视图等 .

我需要在应用程序中获取一个不记名令牌,以便它可以调用各种Web API服务 .

从安全角度来看,将承载令牌传递给响应头中的用户浏览器是否可以接受?然后,当Angular JS应用程序启动时,它将从标头读取值并将其放入本地存储器以用于后续API请求 .

用户流程......

  • 用户访问他/她未经过身份验证的members.domain.com .

  • 用户重定向到OAuth提供商 .

  • 用户通过提供商进行身份验证 .

  • 然后将用户重定向回members.domain.com . 用户现在已经过身份验证,他们有一个cookie .

  • 初始应用程序页面通过MVC管道呈现 . 检查声明并根据用户声明使用菜单选项(等)呈现UI(例如,角色= "recruiter"等) .

这将在用户浏览器上呈现初始应用程序,并根据用户声明创建菜单选项 .

现在缺少的部分是在浏览器中获取一个持票人令牌,可以用来调用各种API .

2 回答

  • 1

    UPDATE :我根据您更新的问题完全改变了我的答案 .

    你想要做的事实际上听起来不错 . 听起来您将在客户端检查JWT作为您的Bearer令牌 .

    要做到这一点,你需要做两件事之一:

    • 如果你通过使用cookie确保'_912122安全',你可以在你的后端( /me 或类似的东西)创建一个路由,当被请求时,它会返回所有当前登录用户的个人数据(他们的声明,以及呈现你需要的任何内容) UI) . 当Angular应用程序启动时,它可以向此页面发出请求,将通过已设置的cookie进行身份验证,并且只返回前端需要的任何数据来进行渲染 .

    • 如果你想在纯JS中做任何事情而冒更容易受到XSS攻击的风险,那么你可以将它存储在HTML5本地存储中,而不是将用户的Bearer令牌存储在cookie中 . 这样,您的Angular应用程序可以直接在浏览器中通过Javascript访问令牌以呈现页面 . 这可能会提供更快的性能,但这意味着任何可以在您的域上运行恶意JS的人也将能够读取用户的Bearer令牌(来自LocalStorage),并可能导致问题 .

    最后:如果您使用LocalStorage路由,并将Bearer令牌存储在LocalStorage中,那么您可以执行以下操作来验证对您的后端的Angular API请求:

    • 从LocalStorage中获取持有者令牌 .

    • 向您的后端发出API请求,将Bearer令牌放入HTTP Authorization 标头中 .

    • 在您的后端,解析HTTP Authorization 标头,并获取令牌 .

    • 验证令牌以确保JWT有效/未过期/等 .

    • 就是这样!

    用于验证API请求的标准HTTP标头是HTTP授权,因此如果您想要执行您正在描述的流程(使用LocalStorage),只需将您的令牌放入HTTP授权中,您就可以开始使用了 . 大多数Web框架会自动处理此标头的解析,并在那里查找您将要发送的令牌等凭据 .

  • 0

    你可以使用这段代码......

    var loginApp = angular.module("LoginApp", ["LocalStorageModule"]);
    
    loginApp.service("loginService", function ($http, $q) {
    this.loginService = function (url, method, data, headers) {
        var deferred = $q.defer();
        $http({
            method: method,
            headers: headers,
            data: data,
            url: url
        })
            .success(function (response) {
                deferred.resolve(response);
            })
            .error(function (error) {
                deferred.reject(error);
            });
        return deferred.promise;
    };});
    
    loginApp.controller("LoginController", [
    "$http", "loginService", "localStorageService",
    function (http, service, localStorageService) {
        var self = this;
        localStorageService.remove("authorizationData");
        self.login = function () {
    
            var url = "http://localhost:port/token";
            var data = "grant_type=password&username=" + self.username + "&password=" + self.password;
    
            service.loginService(url, "POST", data, { 'Content-Type': "application/x-www-form-urlencoded" })
                .then(function (response) {
    
                    var obj = {
                        token: response.access_token,
                        userName: response.userName
                    };
                    localStorageService.set("authorizationData", obj);
                }, function (error) {
                    alert("username or password incorrect");
                });
        };
    }]);
    

相关问题