4

我正在尝试在我的应用程序中添加使用 github 登录。因此,在我的本地机器上进行测试时,我将我的回调 url 设置为这样http://localhost:8000/login/callback/

之后,我像这样向我的页面添加一个登录链接<a href="https://github.com/login/oauth/authorize?client_id=CLIENT_ID&scope=user&redirect_uri=http://localhost:8000/login/callback">Login</a>,还有

$routeProvider.when('/login/callback', {
  controller: 'loginCtrl'
});

它成功返回给我一个带有如下链接的代码:http://localhost:8000/login/callback?code=cd07ff3b70f5d1d1b8a2. 但是angularjs无法正确响应。

Error response

Error code 404.

Message: File not found.

Error code explanation: 404 = Nothing matches the given URI.

我也尝试将我的 redirect_url 设置为http://localhost:8000/#/login/callback,但返回链接是这样的http://localhost:8000/?code=61e9c8b73c073a0bccc0/#/login/callback

我需要代码出现在 url 的末尾而不是中间,以便我可以$location.search().code用来获取我的代码。如何正确设置?

比如更改我的redirect_uri 或更改我的路由器?

4

2 回答 2

1

@lowerkey 我仍然不知道如何处理,但我认为那是因为页面已重新加载

当您未设置html5Modetotrue时,将#在 url 处,如果您重新加载页面,#则会将信息跟踪到api$scope以使用htmlHistoryapi,以便即使页面刷新,应用程序也可以正常工作。

但是一旦设置html5Modetrue,就没有#存储任何$scope信息,当页面重新加载时,angular 找不到相应的范围,所以它返回404

您可以查看angularjs guide 上的 $location 部分,它有一个部分解释了为什么会发生这种情况。

页面重新加载导航

$location 服务只允许您更改 URL;它不允许您重新加载页面。当您需要更改 URL 并重新加载页面或导航到不同的页面时,请使用较低级别的 API,$window.location.href。

于 2013-07-16T01:24:47.513 回答
0

我们应该以某种方式推动 github 以对 html5 友好的方式发送参数,即

/login/callback/:code

现在我已经为它创建了我的黑客解决方案:

var code = parseUrlParam($location.absUrl(), 'code');
function parseUrlParam(url, param){
  var temp = url.match(param + '=(\\w*)');
  if(!temp[1]){
    return false;
  }
  return temp[1];
}  
于 2014-03-16T09:21:30.443 回答