Keycloak 未知提供者错误

7
我正在使用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中插入了通过Bower引入的keycloak.js。

同时,我在dom ready中实例化了以下的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();
  });
});
2个回答

1
我有同样的问题,目前我所知道的是Keycloak的示例运行在angular 1.2上,而你可能使用的是最新的1.3版本。
如果你尝试使用angular 1.2运行Keycloak angular示例,它可以正常工作,但是当你尝试使用1.3时,会出现错误。

我一直在阅读相关内容,这与拦截器有关,它们在angular 1.3中声明的方式不同。 此外,在angular 1.3中,responseInterceptors已经完全被弃用。


1
因为这个原因偶然发现了这个SO问题:keycloak github仓库的Angular JS示例适用于AngularJS 1.2。正在使用1.3+版本,准备好后将在keycloak存储库上提交PR。 - Mat
1
我遇到了完全相同的问题,想知道你是否已经在1.3上解决了它,并且是否在任何地方发布了代码。这对我来说将非常有帮助,谢谢! - Raul Butuc
我有一个几年前使用 Angular 1.5.11 和 Keycloak 9.0.0 的示例可以运行。 - Juan Diego

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配置函数下面。 - Passionate Engineer
问题是,即使我删除了DOM准备好的代码,我仍然得到相同的错误。 - Passionate Engineer
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Passionate Engineer
模块名称后的空数组是我模块所依赖的模块列表。这是必需的。如果您的模块没有任何依赖,您必须放置一个空数组。 - hayatoShingu
我想说的是关于domready,你是在这个事件触发后定义一个工厂。我所说的工厂是“Auth”。该工厂应该在其他地方定义并在domready之后使用。 - hayatoShingu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接