Ruby GitHub OAuth授权请求没有';t重定向到授权应用程序页面
我用Ruby中的法拉第实现了自己的类,用于通过OAuth到GitHub处理授权。我已经验证了在以下条件下: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进行响应 我的问题是,
- 没有登录到GitHub
- 应用程序不存在令牌
状态
变量的获取
至“/login/oauth/authorize”
的授权请求:
- 重定向到GitHub登录页面
- 登录后重定向到授权应用程序页面
- 授权后使用临时代码执行对我的应用程序的回调
- 当I
到带有临时代码的POST
时,使用access\u-token进行响应“/login/oauth/access\u-token”
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支持部门。一旦全部解决,我也会在这里更新结果。