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
)。您不必覆盖它。
我正在使用 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
)。您不必覆盖它。