2014-04-17 107 views
1

我已经在Ruby中使用Faraday实现了我自己的类,以通过OAuth处理授权给GitHub。我验证过下列条件:GitHub OAuth授权请求不会重定向到授权应用程序页面

  • 没有登录到GitHub的
  • 没有令牌存在应用

是通过GET授权请求"/login/oauth/authorize"用随机变量state

  • 重定向到GitHub的登录页面
  • 重定向到授权应用程序页面登录后
  • 授权
  • 会回应的access_token后执行回调到我的临时代码的应用程序时,我POST"/login/oauth/access_token"临时代码

我的问题是,当我改变第一个条件,我还没有登录到GitHub。相同的GET请求被发送到GitHub,我看到正确的URL和正确的参数。然后我看到GitHub的参数return_to似乎是正确的重定向,但它很快就会重新导向回到GitHub主页。

我希望这很容易就像忘记头部参数或其他东西,有人可能马上发现问题。无论如何,任何帮助表示赞赏...

代码设置法拉第连接:

def connection 
    @connection ||= Faraday.new(url: 'https://github.com') do |faraday| 
    faraday.request :url_encoded 
    faraday.response :logger 
    faraday.adapter Faraday.default_adapter 
    end 
end 

代码发送的授权请求:

def request_authorization(client_id, redirect_uri, redirect_id, scope, expected_state) 
    response = connection.get '/login/oauth/authorize', { 
    client_id: client_id, 
    redirect_uri: "#{redirect_uri}?id=#{redirect_id}", 
    scope: scope, 
    state: expected_state 
    } 

    if response.status == 302 
    response.headers[:location] 
    else 
    nil 
    end 
end 

我没有显示的代码,但我的控制器重定向到来自request_authorization()的URL回复。同样,在这两种情况下,我都能看到来自控制器的重定向,但第二种情况似乎遇到了GitHub在重定向请求中不喜欢的东西。我假设它然后重定向到主页,并且从不回复我的应用程序,因为我的原始请求中存在未知问题。

谢谢, 大卫

+0

嘿大卫!你能用curl -v调用重现这个问题吗?如果是这样,请将这些详细信息发送到[email protected],以便我们可以查看。 –

+0

非常有趣......经过更多的curl和RequestBin调试后,我发现GitHub主页确实包含一个实际没有显示的错误。在HTML主体的末尾有一个ajax-error-message div,它表示“请求出错了,请重试。”我将总结所有调试信息并发送给GitHub支持。一旦完成解决,我也会在这里更新结果。 – dmulter

回答

1

伊万从GitHub是找到了答案,我的问题有很大的帮助。我认为问题是使用法拉第或OAuth的一些细节,但事实证明这个问题是一个基本的假设,证明是错误的。希望这会帮助那些陷入类似误解的人。

我假设我想要连接到GitHub(或其他OAuth服务)的应用程序的用户会向我的应用程序发出类似“连接”请求的内容。然后,我的应用程序会向GitHub生成OAuth授权请求,处理任何重定向,并最终结束向用户提交授权应用程序页面以供接受。

原来我只是想让“连接”请求实际上是一个链接,直接向GitHub发出授权请求。我的应用程序只需要担心处理回调,它已经做了。更容易,现在可以在所有情况下工作。

由于这种情况很简单,因此在未登录时发现错误的方法。它在登录时失败,因为我没有处理通常浏览器会提供的会话状态。

对OAuth RFC进行更仔细的阅读,清楚了我对于为用户代理和客户端处理请求和响应的困惑。

相关问题