我可以使用RequireJS设置授权标头吗?

时间:2015-11-11 18:04:38

标签: authentication requirejs

我们希望为AngularJS应用程序(公共/私有)提供2组资源,这些资源使用RequireJS进行依赖关系管理。基本上登录页面上的所有内容都是公开的,一旦登录,将加载另一个angularjs应用程序(新的requirejs配置),这将加载需要身份验证才能访问的资源。

有没有办法在加载资源时配置requirejs来设置授权标头?

1 个答案:

答案 0 :(得分:0)

这取决于“资源”的含义以及服务器的配置方式。但总的来说 - 是的,既然你使用的是AngularJS,你可以使用$ httpProvider注入一个拦截器服务。

例如,在服务中:

        var dependencies = ['$rootScope', 'userService'];

        var service = function ($rootScope, userService) {
            return {
                request: function(config) {
                    var currentUser = userService.getCurrentUser();
                    var access_token = currentUser ? currentUser.access_token : null;

                    if(access_token) {
                        config.headers.authorization = access_token;
                    }
                    return config;
                },
                responseError: function (response) {
                    if(response.status === 401) {
                        $rootScope.$broadcast('unauthorized');
                    }
                    return response;
                }
            };
        };

        module.factory(name, dependencies.concat(service));

然后,在配置路线后,您可以使用:

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

您可以在此处找到有关拦截器的更多信息:https://docs.angularjs.org/api/ng/service/$http#interceptors

<强>更新

您可以使用文本插件尝试接收它,但我没有看到保护客户端代码的重点。另外,如果你想使用优化,那么无论如何资源都只会出现在一个文件中......

 config: {
        text: {
            onXhr: function (xhr, url) {
               xhr.setRequestHeader('Authorization','Basic ' + token);
            }
        }
    }

请参阅:custom-xhr-hooks

另一个更新

您也可以在不使用文本插件的情况下使用urlArgs(主要用于缓存失效):

require.config({
    urlArgs: 'token='+token,
    ...
)}