gpt4 book ai didi

http - 将 angularjs http-auth 与 $resource 一起使用

转载 作者:可可西里 更新时间:2023-11-01 15:27:44 26 4
gpt4 key购买 nike

我正在尝试制作 HTTP Auth Interceptor模块与 $resource 一起工作。

现在,我有一个基本的应用程序可以使用这样的服务:

angular.module('myApp.services', ['ngResource']).
factory('User', function($resource){
return $resource('path/to/json/', {}, { 'login': { method: 'GET' } });
});

然后像这样的 Controller :

angular.module('myApp.controllers', []).
controller('User', ['$scope', 'User', function($scope, List)
{ $scope.user = User.query();
]);

和应用程序:

angular.module('myApp', ['myApp.services', 'myApp.directives', 'myApp.controllers']).
config(['$routeProvider', function($routeProvider) {
$routeProvider.when('/dashboard', {templateUrl: 'partials/dashboard.html', controller: 'Dashboard'});
$routeProvider.when('/user', {templateUrl: 'partials/user.html', controller: 'TrackingCtrl'});
$routeProvider.otherwise({redirectTo: '/dashboard'});
}]);

到目前为止,一切都按预期进行。然后,我在服务器上放置了一个 http 身份验证,因此 json 文件的 http 状态为 401,浏览器显示一个登录弹出窗口。我想使用 HTTP Auth 拦截器模块来替换浏览器登录弹出窗口并处理登录。这是这个脚本的目的,对吧?

为此,我试图理解 demo of the script并使它与我的应用程序一起工作。

首先,我将 'http-auth-interceptor' 注入(inject)应用程序。

然后,这被添加到 index.html

<body ng-controller="UserCtrl" class="auth-demo-application waiting-for-angular">

以及 ng-view 上方的登录表单:

<div id="login-holder">
<div id="loginbox">
<div id="login-inner" ng:controller="LoginController">
<form ng-submit="submit()">
Username: <input type="text" class="login-inp" ng-model="username"/><br/>
Password: <input type="password" class="login-inp" ng-model="password"/><br/>
<input type="submit" class="submit-login"/>
</form>
</div>
</div>
</div>

和页面底部的脚本:

<script src="lib/directives/http-auth-interceptor.js"></script>

在 controller.js 中:

    controller('LoginController', ['$scope', 'authService', 'User', function ($scope, authService, User) {
$scope.submit = function() {
User.login(
function(user, response) { // success
authService.loginConfirmed();
console.log('login confirmed');
}
);
}
}])

还有这个指令:

directive('authDemoApplication', function() {
return {
restrict: 'C',
link: function(scope, elem, attrs) {
//once Angular is started, remove class:
elem.removeClass('waiting-for-angular');

var login = elem.find('#login-holder');
var main = elem.find('#content');

login.hide();

scope.$on('event:auth-loginRequired', function() {
login.slideDown('slow', function() {
main.hide();
});
});
scope.$on('event:auth-loginConfirmed', function() {
main.show();
login.slideUp();
});
}
}
})

好的……就是这样。但它根本不起作用:浏览器登录表单仍然存在。这是唯一的登录方式。

关于我应该做些什么来完成这项工作有什么想法吗?

最佳答案

来自他们的网页:

典型用例:

  • 某处:$http(...).then(function(response) { do-something-with-response }) 被调用,
  • 该请求的响应是 HTTP 401,
  • 'http-auth-interceptor' 捕获初始请求并广播 'event:auth-loginRequired',
  • 您的应用程序将此拦截到例如显示登录对话框(或其他任何内容),
  • 一旦您的应用程序确定身份验证正常,您将调用:authService.loginConfirmed(),
  • 现在将重试您最初失败的请求,最后,do-something-with-response 将触发。

因此,要与之交互,您唯一需要做的就是让父作用域监听 even:auth-loginRequired。这可以在指令中完成,在 Controller 中,没关系。我没有使用过该软件,但我正在想象这样的事情:

angular.module('myApp', [])
.service('api', function(httpAutenticationService, $rootScope, $location) {
$rootScope.$on('event:auth-loginRequired', function() {
// For the sake of this example, let's say we redirect the user to a login page
$location.path('/login')
})
$http.get(API_URL).then( ... ); // If the user is not authenticated, this will be intercepted (1)
})
.controller('LoginController', function(httpAutenticationService) {
// Let's imagine you have a route with the 'controller' option to this controller
$http.get(LOGIN_URL).then(function() {
httpAutenticationService.loginConfirmed(); // The success callback from (1) will be executed now
}, function(){
alert("Invalid credentials")
})
})

关于http - 将 angularjs http-auth 与 $resource 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18776248/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com