0

嗨,我是 Ruby/Rails 的新手,我有一个关于使用 GitHub 的 Octokit 的 Ruby 版本处理 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>
4

1 回答 1

2

因为它没有在自述文件中明确说明这一点。我建议始终通过源代码来更好地了解 gem 的工作原理。通常,您会发现 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
于 2014-01-26T17:38:59.900 回答