在AngularJS中如何跟随HTTP GET请求的重定向?

9
我正在为教练们设计一个网站,通过社交媒体帮助人们拥有更健康的生活。目前,我正在使用ExpressJS服务器和AngularJS前端来访问Twitter的OAuth。
AngularJS的网站中得知:

响应状态码在200到299之间被视为成功状态,并将导致调用成功回调函数。请注意,如果响应是重定向,则XMLHttpRequest会透明地跟随它,这意味着对于此类响应,不会调用错误回调。

我的服务器完整代码可以在GitHub上的web.jstwitter.js中找到,但以下是调用者:
function LoginCtrl($scope, $http, $location) {
  $scope.welcome = 'Sign in with Twitter';
  $http.defaults.useXDomain = true;    
  $scope.submit = function() {    
    $http({method: 'GET', url: '/sessions/connect'}).
    success(function(data, status) {
        $scope.welcome = data;
    });
  };
}

这是 web.js 中的被调用者:

app.get('/sessions/connect', function(req, res){
  consumer().getOAuthRequestToken(function(error, oauthToken, oauthTokenSecret, results){
    if (error) {
      res.send("Error getting OAuth request token : " + sys.inspect(error), 500);
    } else {  
      req.session.oauthRequestToken = oauthToken;
      req.session.oauthRequestTokenSecret = oauthTokenSecret;
      res.redirect("https://api.twitter.com/oauth/authorize?oauth_token="+req.session.oauthRequestToken);      
    }
  });
});

如果我使用 tcpdump 进行检查(抱歉,我有点老派),我会看到:

Connection:.keep-alive....Moved.Temporarily..Redirecting.to.https://api.twitter.com/oauth/authorize?oauth_token=***

当我手动在浏览器中访问此服务器/sessions/connect时,这当然很好,并且确实发生了。然而,使用AngularJS时,我的浏览器屏幕实际上没有重定向。为什么呢?

1个回答

7

$http 可以获取页面的内容,但它会把结果放在 promise 中返回,如果没有特别要求,它不会改变你的页面。在 then 处理程序中,你可以执行某些操作来重定向你的页面。这里有一个示例,说明如何实现此操作:处理 Angular POST 发出的 Express 重定向


但是如果我使用 res.send("redirection suggestion to https://"),我将会被重定向到 Twitter 页面。从那里,我的服务器上的某些东西将被调用(路由 /sessions/callback),而我将无法在 AngularJS 控制器中获取该回调的响应对象,对吗?在服务器上使用 oauth 与 AngularJS 一起可能不可行吗? - Anne van Rossum
@ondervloei Twitter在其网站上详细介绍了OAuth过程:https://dev.twitter.com/docs/auth/implementing-sign-twitter。您需要将浏览器重定向到Twitter,然后Twitter会使用令牌将其重定向回您的服务器。然后,您可以从服务器将令牌传递回Angular。如果您想保留页面,则可以打开一个新窗口。 - John Tseng
我之前在C++中实现过oauth。很抱歉,我对服务器端和客户端代码之间的交互不够熟练,无法满足此处的要求。不过我认为我已经理解了一般的方案,即通过AngularJS在客户端设置路由。这个谜题有很多部分,如果您向我推荐这些网站,就意味着您认为我没有访问过它们。 :-) - Anne van Rossum
@ondervloei 我明白了。您需要将浏览器重定向到Twitter才能使OAuth工作。否则,Twitter无法确定其用户的凭据是否受保护。您可以尝试使用iframe。整个重点是为了让Twitter拥有绝对控制权,以便他们可以授权用户。 - John Tseng
抱歉,但这不起作用。在您向用户代理发出重定向之前,Angular会获取重定向页面。 - user2312578

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