您好我是Ruby / Rails的新手,我有一个关于使用Ruby版GitHub的Octokit处理OAuth响应的问题。阅读完文档之后,我对如何使用包装器和使用RestClient遵循最佳实践感到困惑。当我授权我的应用程序时,响应返回一个“代码”,我应该交换访问令牌。
在GitHub API文档中,它显示了一个使用Restclient的Sinatra示例,该示例目前在我的会话控制器的创建操作中。但是,它说你应该在构建应用程序时采用不同的方法,并且应该使用Octokit库,但我找不到任何关于如何使用Octokit交换访问令牌代码的文档。
我的目标是能够通过用户的GitHub帐户为应用创建新成员,保存该信息,&然后使用该帐户签名,而不是创建用户名/密码。我已经粘贴了下面的new.html.erb代码,以显示我正在制作的请求。非常感谢任何帮助,谢谢!
会话控制器
class SessionsController < ApplicationController
def new
@client_id = Octokit.client_id
end
def create
# CHANGE THIS TO USE OCTOKIT INSTEAD
session_code = request.env['rack.request.query_hash']['code']
result = RestClient.post('https://github.com/login/oauth/access_token',
{:client_id => Octokit.client_id,
:client_secret => Octokit.client_secret,
:code => session_code},
:accept => :json)
access_token = JSON.parse(result)['access_token']
end
end
OAuth请求
<p>
Sign In with GitHub
</p>
<p>
<a href="https://github.com/login/oauth/authorize?scope=user:follow&client_id=<%= @client_id %>">Click here</a> to begin!</a>
</p>
答案 0 :(得分:2)
因为它没有在README中明确说明这一点。我建议总是通过源代码来更好地理解gem的工作原理。通常你会发现宝石的创建者编写了很好的代码,这些代码是不言自明的,有时甚至可以评论提供更多信息,如下面的情况。这是您正在寻找的方法,祝您学习Ruby / Rails之旅顺利,欢迎您!如果您有任何其他问题并且遇到任何其他问题,请告诉我。
# Retrieve the access_token.
#
# @param code [String] Authorization code generated by GitHub.
# @param app_id [String] Client Id we received when our application was registered with GitHub.
# @param app_secret [String] Client Secret we received when our application was registered with GitHub.
# @return [Sawyer::Resource] Hash holding the access token.
# @see http://developer.github.com/v3/oauth/#web-application-flow
# @example
# Octokit.exchange_code_for_token('aaaa', 'xxxx', 'yyyy', {:accept => 'application/json'})
def exchange_code_for_token(code, app_id = client_id, app_secret = client_secret, options = {})
options.merge!({
:code => code,
:client_id => app_id,
:client_secret => app_secret,
:headers => {
:content_type => 'application/json',
:accept => 'application/json'
}
})
post "#{web_endpoint}login/oauth/access_token", options
end