【问题标题】:Keycloak Unknown Provider errorKeycloak 未知提供程序错误
【发布时间】:2015-03-28 13:37:57
【问题描述】:

我正在使用 Keycloak.js 与 Keycloak 交互并得到以下错误

Uncaught Error: [$injector:unpr] Unknown provider: AuthProvider <- Auth <- authInterceptor <- $http <- $templateRequest <- $compile

以下代码:

module.factory('authInterceptor', ['$q', 'Auth', function($q, Auth) {
  return {
    request: function (config) {
      var deferred = $q.defer();
      if (Auth.authz.token) {
        Auth.authz.updateToken(5).success(function() {
          config.headers = config.headers || {};
          config.headers.Authorization = 'Bearer ' + Auth.authz.token;

          deferred.resolve(config);
        }).error(function() {
          deferred.reject('Failed to refresh token');
        });
      }
      return deferred.promise;
    }
  };
}]);

module.config(['$httpProvider', function($httpProvider) {
  $httpProvider.responseInterceptors.push('errorInterceptor');
  $httpProvider.interceptors.push('authInterceptor');
}]);

发生这种情况有什么原因吗?

我还在我的 index.html 中包含了 keycloak.js,它是用 Bower 插入的

我还在 dom 内部实例化了以下 Auth 工厂:

angular.element(document).ready(function($http) {
  var keycloakAuth = new Keycloak('keycloak.json');
  auth.loggedIn = false;

  keycloakAuth.init().success(function () {
    auth.loggedIn = true;
    auth.authz = keycloakAuth;
    auth.logoutUrl = keycloakAuth.authServerUrl + "/realms/demo/tokens/logout?redirect_uri=http://localhost:3000";
    module.factory('Auth', function () {
      return auth;
    });
  }).error(function () {
    window.location.reload();
  });
});

【问题讨论】:

    标签: javascript angularjs bower keycloak


    【解决方案1】:

    问题是您在 dom 就绪时实例化“Auth”,但依赖注入器试图在 dom 就绪之前注入(简化)。

    问题是为什么 dom 准备好了?

    这里有两个例子:

    http://jsbin.com/lulin/1/edit (与 dom 就绪定义,不工作,同样的错误)

    http://jsbin.com/wajeho/2/edit (没有 dom 就绪定义,工作)


    编辑:

    你必须这样做: http://jsbin.com/xusiva/1/edit?html,js,console

    我在 domready 之外定义工厂,在 domready 之后我在控制器内部使用它。

    【讨论】:

    • 这是 dom 准备好的,所以我可以让它立即进行身份验证。我不确定这是否需要在 index.js 配置函数下
    • 问题是即使我删除 dom 准备好我也会遇到同样的错误
    • 在您的示例中,为什么在模块的第二个参数中添加 [] 时它会起作用,但当我删除它时它不起作用?
    • 模块名后面的空数组是我的模块所依赖的模块列表。不是可选的。如果您的模块没有依赖项,则必须放置空数组。
    • 关于 domready,我想说的是,您在此事件发生后定义了一个工厂。我说的工厂是“Auth”。该工厂应该在其他地方定义并在 domready 之后使用。
    【解决方案2】:

    我有同样的问题,到目前为止,我可以说 Keycloak 的示例正在运行 angular 1.2,而您可能使用的是最新的 1.3。
    如果您尝试使用 Angular 1.2 的 Keycloak 角度示例,它可以工作,但是当您使用 1.3 尝试它时,您会收到该错误。

    我正在阅读这方面的内容,它与拦截器有关,它们在 Angular 1.3 中声明的方式不同。 此外,在 Angular 1.3 中完全弃用了 responseInterceptors。

    【讨论】:

    • 出于这个原因偶然发现了这个 SO 问题:keycloak github repo Angular JS example is for AngularJS 1.2。在 1.3+ 版本上工作,准备好后将在 keycloak 存储库上 PR
    • 我遇到了完全相同的问题,我想知道您是否可以使用 1.3 以及是否将代码发布到任何地方。对我有很大帮助,谢谢!
    • 我有一个几年前使用 angular 1.5.11 和 keycloak 9.0.0 的示例
    猜你喜欢
    • 2013-07-07
    • 2015-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    相关资源
    最近更新 更多