如何使用Octokit Ruby与Restclient处理OAuth响应

时间:2014-01-26 17:20:28

标签: ruby-on-rails oauth-2.0 github-api octokit

您好我是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>

1 个答案:

答案 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