Angularjs 具有角度前端的Web Api OAuth-无法处理302重定向
我一直在试图用OAuth(在knockout.js中)将WebAPI SPA模板重写为AngularJS 当我单击外部登录按钮时,会发生一系列请求,最终导致Angularjs 具有角度前端的Web Api OAuth-无法处理302重定向,angularjs,oauth,asp.net-web-api,Angularjs,Oauth,Asp.net Web Api,我一直在试图用OAuth(在knockout.js中)将WebAPI SPA模板重写为AngularJS 当我单击外部登录按钮时,会发生一系列请求,最终导致 Authentication.SignIn(claimsIdentity); 这很好!但是,在我返回Ok()之后,我立即被重定向到外部登录(Google)。在我登录谷歌后,他们的授权服务器会响应一个302重定向到以下位置: http://localhost:59936/access_token=xxxx&token_type=b
Authentication.SignIn(claimsIdentity);
这很好!但是,在我返回Ok()
之后,我立即被重定向到外部登录(Google)。在我登录谷歌后,他们的授权服务器会响应一个302重定向到以下位置:
http://localhost:59936/access_token=xxxx&token_type=bearer&expires_in=1209600&state=yyyy
在knockout中查看SPA模板,我应该解析令牌的URL,并使用访问令牌调用getUserInfo()
然而,所发生的事情是,链接只是塞进了我的浏览器URL栏,Angular对此一无所知。我的httpInterceptor
不会启动,也不会启动$routeChanged
,我认为制作$routeProvider是愚蠢的/肮脏的/可能不起作用。当(“/access\u token”)
我在1.2.9Angular中(我看到有人在Angular中提到了一个bug,关于它的http拦截器处理302,我找不到这个bug,它在1.2.9中得到了修复,但似乎不是这样
怎么办
编辑:事实上,考虑到代码的结构,使用routeProvider
捕获代码实际上不会太脏。这是因为HomeController
看起来像这样:
function HomeController(...) {
//Parses the url above
var fragment = getFragment();
... All kinds of fragment checks (fragment.access_token, fragment.state, etc)...
}
问题是当这个URL被塞进浏览器时,HomeController
没有被实例化
有没有办法将上面的URL与路由匹配?类似于when('/access\u token*rest')
——但是这不起作用
我能想到的一个潜在解决方法是捕获$locationChangeStart
中的URL更改,并将access\U令牌
填充到本地/会话存储中,但这需要大量的代码重构,因为所有逻辑都已经在HomeController
中。最好的方法是在RL被击中
不令人满意的解决方法:这里有另一个解决方法,但我真的不满意。这是一个很粗糙的方法,需要大量的重组
app.run(['$rootScope', '$location', '$http', '$controller', 'AuthenticationService',
'$window', 'StorageService', //HomeController Dependencies
function ($rootScope,
$location,
$http,
$controller,
AuthenticationService,
$window, StorageService)
{
$rootScope.$on("$locationChangeStart", function (event, next, current) {
if (next.indexOf("access_token") > -1) {
var homeController = $controller(Controllers.Authentication.HomeController, {
'$rootScope': $rootScope,
'$scope': {},
'$window': $window,
'$location': $location,
'AuthenticationService': AuthenticationService,
'StorageService': StorageService
});
}
});
}
有没有办法将上面的url与路由匹配?比如when('/access_-token*rest')--但是这不起作用
如果您的URL是http://localhost:59936/?access_token=xxxx&token_type=bearer&expires_in=1209600&state=yyyy
(注意添加的?
)然后路由器可以像这样匹配它$routeProvider。当('/')
(因为路由器将忽略参数字符串)时,您可以在控制器中解析url参数
此外部登录是否导致包含angular应用程序的页面重定向到外部网页?如果是这种情况,则您的应用程序将被卸载,这可能并不理想。要处理外部登录,我通常会打开一个弹出窗口,以便我的应用程序不会被卸载