Ruby GitHub OAuth授权请求没有';t重定向到授权应用程序页面

Ruby GitHub OAuth授权请求没有';t重定向到授权应用程序页面,ruby,redirect,oauth,github-api,faraday,Ruby,Redirect,Oauth,Github Api,Faraday,我用Ruby中的法拉第实现了自己的类,用于通过OAuth到GitHub处理授权。我已经验证了在以下条件下: 没有登录到GitHub 应用程序不存在令牌 通过带有随机状态变量的获取至“/login/oauth/authorize”的授权请求: 重定向到GitHub登录页面 登录后重定向到授权应用程序页面 授权后使用临时代码执行对我的应用程序的回调 当IPOST到带有临时代码的“/login/oauth/access\u-token”时,使用access\u-token进行响应 我的问题是,

我用Ruby中的法拉第实现了自己的类,用于通过OAuth到GitHub处理授权。我已经验证了在以下条件下:

  • 没有登录到GitHub
  • 应用程序不存在令牌
通过带有随机
状态
变量的
获取
“/login/oauth/authorize”
的授权请求:

  • 重定向到GitHub登录页面
  • 登录后重定向到授权应用程序页面
  • 授权后使用临时代码执行对我的应用程序的回调
  • 当I
    POST
    到带有临时代码的
    “/login/oauth/access\u-token”
    时,使用access\u-token进行响应
我的问题是,当我改变第一个条件时,我还没有登录到GitHub。相同的GET请求被发送到GitHub,我看到了正确的URL和正确的参数。然后我看到GitHub使用
return\u 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\u authorization()
重定向到URL回复。同样,在这两种情况下,我肯定看到了控制器的重定向,但第二种情况似乎遇到了GitHub不喜欢的重定向请求。我假设它会重定向到主页,并且不会回复我的应用程序,因为我的原始请求中存在未知问题

谢谢,
GitHub的大卫

伊万帮了我很大的忙,帮我找到了问题的答案。我假设问题是使用法拉第或OAuth时的一些细节,但事实证明问题是一个被证明是错误的基本假设。希望这能帮助其他陷入类似误解的人

我假设我的应用程序的用户想要连接到GitHub(或另一个OAuth服务),会向我的应用程序发出类似“连接”的请求。然后,我的应用程序将向GitHub生成OAuth授权请求,处理任何重定向,并最终向用户展示授权应用程序页面以供接受

事实证明,我只需要将“连接”请求实际上作为一个链接,直接向GitHub发出授权请求。然后,我的应用程序只需担心处理回调,它已经做到了。更简单,现在在所有情况下都可以使用

事实证明,由于这是一个简单的情况,在未登录时,错误的方法起作用。登录时失败,因为我没有处理浏览器通常提供的会话状态


更仔细地阅读OAuth RFC消除了我对用户代理和客户端的请求和响应处理位置的困惑。

嘿,David!你能用
curl-v
调用重现这个问题吗?如果是,请将这些详细信息发送至support@github.com这样我们可以看一看。非常有趣。。。经过更多的curl和RequestBin调试之后,我注意到GitHub主页确实包含了一个没有实际显示的错误。HTML正文末尾有一条ajax错误消息div,上面说“该请求出现了问题,请重试。”我将总结所有调试信息并发送给GitHub支持部门。一旦全部解决,我也会在这里更新结果。