Keycloak 未知提供程序错误
Keycloak Unknown Provider error
我正在使用 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
插入的
我也有下面的 Auth 工厂在 dom 内实例化准备就绪:
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();
});
});
问题是您在 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 之后在控制器内部定义我正在使用它。
我也遇到了同样的问题,目前我能知道的是Keycloak的例子是运行 angular 1.2,你可能用的是最新的1.3.
如果您尝试使用 angular 1.2 的 Keycloak angular 示例,它可以工作,但是当您使用 1.3 尝试它时,您会收到该错误。
我一直在阅读这个,它与拦截器有关,它们在 angular 1.3 中的声明方式不同。
此外,在 angular 1.3.
中完全弃用了 responseInterceptors
我正在使用 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
插入的我也有下面的 Auth 工厂在 dom 内实例化准备就绪:
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();
});
});
问题是您在 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 之后在控制器内部定义我正在使用它。
我也遇到了同样的问题,目前我能知道的是Keycloak的例子是运行 angular 1.2,你可能用的是最新的1.3.
如果您尝试使用 angular 1.2 的 Keycloak angular 示例,它可以工作,但是当您使用 1.3 尝试它时,您会收到该错误。
我一直在阅读这个,它与拦截器有关,它们在 angular 1.3 中的声明方式不同。 此外,在 angular 1.3.
中完全弃用了 responseInterceptors