我已经使用Ruby中的Faraday实现了我自己的类,用于通过OAuth处理授权到GitHub。我已在以下条件下验证:
通过GET
向"/login/oauth/authorize"
申请授权并使用随机state
变量:
POST
时使用access_token回复我遇到的问题是当我改变第一个条件时,我还没有登录到GitHub。相同的GET请求被发送到GitHub,我看到正确的URL和正确的参数。然后我看到GitHub带有"/login/oauth/access_token"
参数的正确重定向,但它很快就会重新定向到GitHub主页。
我希望忘记标题参数或其他东西很简单,有人可能会立即发现问题。无论如何,任何帮助表示赞赏...
设置法拉第连接的代码:
return_to
发送授权请求的代码:
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
的网址回复。同样,我确实在两种情况下都看到了来自我的控制器的重定向,但第二种情况似乎遇到了GitHub在重定向请求中不喜欢的东西。我假设它然后重定向到主页,并且从不回复我的应用程序,因为我的原始请求中存在这个未知问题。
谢谢, 大卫
答案 0 :(得分:1)
来自GitHub的Ivan在寻找我的问题的答案方面提供了很大的帮助。我假设问题是使用法拉第或OAuth的一些细节,但事实证明问题是一个被证明是错误的基本假设。希望这会帮助其他遇到类似误解的人。
我曾假设我的应用程序的用户想要连接到GitHub(或其他OAuth服务)会发出像" connect"请求我的应用程序。然后,我的应用程序会向GitHub生成OAuth授权请求,处理任何重定向,并最终将授权应用程序页面呈现给用户以供接受。
原来我只需要制作" connect"请求实际上是一个直接向GitHub发出授权请求的链接。我的应用程序只需要担心处理它已经做过的回调。现在更容易并适用于所有情况。
由于这是一个简单的案例,原因是没有登录的错误方法。登录时失败,因为我没有处理通常浏览器提供的会话状态。
更仔细地阅读OAuth RFC,清除了我对用户代理和客户端的请求和响应处理位置的困惑。