Angularjs 具有角度前端的Web Api OAuth-无法处理302重定向

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

我一直在试图用OAuth(在knockout.js中)将WebAPI SPA模板重写为AngularJS

当我单击外部登录按钮时,会发生一系列请求,最终导致

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应用程序的页面重定向到外部网页?如果是这种情况,则您的应用程序将被卸载,这可能并不理想。要处理外部登录,我通常会打开一个弹出窗口,以便我的应用程序不会被卸载