OmniAuth OAuth 1 upwork 策略 API 错误

OmniAuth OAuth 1 strategy for upwork API error

我正在使用 OmniAuth gem 以及 FB、Linkedin 和 G+ 的特定提供商 gem,用于登录、注册和信息检索。我想提供与其他 API 的进一步集成,在这种情况下,Upwork 的 api 使用 OAuth 1.

我已经用 Upwork 设置了应用程序,并且有工作密钥和秘密。我已将加载程序设置为加载我的自定义策略(因为它不是 gem)并加载。我已将提供者设置为传递存储在 env 文件中的密钥和秘密。

经过几个小时的努力,所有这些现在似乎都在起作用。 我尝试阅读 OmniAuth 策略指南中包含的稀疏信息以及 OAuth wiki,并查看了其他提供商的 gem 文件。我最终复制了一些我认为足以解决这个问题的代码,至少对于登录来说是这样,但我搞砸了。

每当我转到 upwork 的回调路径时,由 omniauth 自动设置我得到一个错误。

    Started GET "/auth/upwork" for ::1 at 2015-07-29 00:08:12 +0800
  ActiveRecord::SchemaMigration Load (0.3ms)  SELECT "schema_migrations".* FROM "schema_migrations"
I, [2015-07-29T00:08:12.169605 #24517]  INFO -- omniauth: (upwork) Request phase initiated.

OAuth::Unauthorized (405 Method Not Allowed):
  lib/omniauth/strategies/upwork.rb:18:in `request_phase'


  Rendered /Users/mnussbaumer/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/actionpack-4.2.1/lib/action_dispatch/middleware/templates/rescues/_source.erb (5.1ms)

根据文档,这似乎是当我尝试仅对 POST 进行 GET,或对仅 GET 端点进行 POST 时。

在 Upwork 的 API 参考文献中,他们明确表示:

Get request token

Endpoint
POST /api/auth/v1/oauth/token/request

我目前的策略是这样的:

require 'json'
require 'omniauth-oauth'

module OmniAuth
    module Strategies
        class Upwork < OmniAuth::Strategies::OAuth

            option :client_options, {
                :site => "https://www.upwork.com/api",
                :request_token_path => "/api/auth/v1/oauth/token/request",
                :authorize_url => "/services/api/auth",
                :access_token_path => "api/auth/v1/oauth/token/access",
            }

            uid { request.params['user_id'] }

            def request_phase
                    request_token = consumer.get_request_token(:oauth_callback => callback_url)
                session['oauth'] ||= {}
                session['oauth'][name.to_s] = {'callback_confirmed' => request_token.callback_confirmed?, 'request_token' => request_token.token, 'request_secret' => request_token.secret}

                    if request_token.callback_confirmed?
                    redirect request_token.authorize_url(options[:authorize_params].merge(:oauth_consumer_key => consumer.key))
                    else
                        redirect request_token.authorize_url(options[:authorize_params].merge(:oauth_callback => callback_url, :oauth_consumer_key => consumer.key))
                end

                    rescue ::Timeout::Error => e
        fail!(:timeout, e)
                rescue ::Net::HTTPFatalError, ::OpenSSL::SSL::SSLError => e
        fail!(:service_unavailable, e)
      end

            def raw_info
                @raw_info ||= JSON.load(access_token.get('/me.json')).body
            end

        end
    end
end

我尝试将 "consumer.get_request_token" 更改为 "consumer.post_request_token",但我认为这与它无关。

request_phase 是从我发现的 gem 中窃取的,而 JSON.load 来自另一个。我认为它只适用于这两个,但似乎不行。我正在慢慢学习如何使用所有这些,并想首先构建一个可用的策略,然后将其作为 public gem 提供给 omniauth。

UpWork 有 API 文档,他们甚至有 ruby 的 gem,但我想对所有内容使用 OmniAuth,另外,我需要弄清楚其他 API 的未来,所以我想知道如何做好这件事。

https://developers.upwork.com/?lang=ruby#authentication_oauth-10

有人可以帮忙吗?或者为 Upwork 创建一个 OmniAuth gem。 谢谢!

(编辑以更改错误 - 现在输出更薄但错误相同)

request_phase 方法实际上是属于 omniauth-oauth 的方法,您在 upwork.rb 之上需要它,并且您的 class Upwork 继承了它(OmniAuth::Strategies::OAuth)。您不必覆盖它。