使用OAuth2 gem时出现代理错误

时间:2014-08-20 14:14:17

标签: ruby ruby-on-rails-3 oauth-2.0

您好我正在尝试使用oauth 2将我的应用程序连接到本地API。 授权请求成功并在我的回调地址上返回一个代码以发出访问令牌请求。 这是我的回调代码:

def client
  OAuth2::Client.new(KEY, SECRET, site: SITE, authorize_url: '/oauth2/auth', token_url: 'http://localhost:8080/oauth2/token')
end

get '/auth/callback' do
  access_token = client.auth_code.get_token(params[:code], "redirect_uri" => redirect_uri)
  access_token =  session[:access_token] = access_token.token
  @access_token = access_token
end

在get_token函数中,我撬了一下检查我的连接配置(这是正确的):

1.9.3 (#<OAuth2::Client:0x007fb255183e18>):0 > connection
=> #<Faraday::Connection:0x007fb2551817f8 
@parallel_manager=nil, 
@headers={"User-Agent"=>"Faraday v0.9.0"}, 
@params={}, @options=#<Faraday::RequestOptions (empty)>, 
@ssl=#<Faraday::SSLOptions (empty)>, 
@default_parallel_manager=nil, 
@builder=#<Faraday::RackBuilder:0x007fb255188760 
@handlers=[Faraday::Request::UrlEncoded, Faraday::Adapter::NetHttp, Faraday::Response::Logger]>, 
@url_prefix=#<URI::HTTP:0x007fb255187b08 URL:http://localhost:3000/>, 
@proxy=#<Faraday::ProxyOptions uri=#<URI::HTTP:0x007fb255186b68 URL:http://proxy_url:port>, user="me", password=« MyPassword">>

1.9.3 (#<OAuth2::Client:0x007fb255183e18>):0 > url
=> "http://localhost:8080/oauth2/token »

1.9.3 (#<OAuth2::Client:0x007f9bdb94cce8>):0 > verb
=> :post

1.9.3 (#<OAuth2::Client:0x007f9bdb94cce8>):0 > opts
=> {
      :body => {
        "client_id" => "Test",
        "client_secret" => "test_secret",
        "code" => "d3c4661b11ea5e2752852db72e1ce100f2f1804d",
        "grant_type" => "authorization_code",
        "redirect_uri" => "http://localhost:4567/auth/callback"
    },
      :headers => {
        "Content-Type" => "application/x-www-form-urlencoded"
    },
      :parse => nil,
      :raise_errors => true
}

来自请求的调试信息:

I, [2014-08-20T12:01:19.450941 #12792]  INFO -- : post    http://localhost:8080/oauth2/token
D, [2014-08-20T12:01:19.451040 #12792] DEBUG -- request: User-Agent: "Faraday v0.9.0"
Content-Type: "application/x-www-form-urlencoded"
I, [2014-08-20T12:01:19.451203 #12792]  INFO -- Status: 401
D, [2014-08-20T12:01:19.451258 #12792] DEBUG -- response: cache-control: "no-cache"
pragma: "no-cache"
www-authenticate: "NTLM, BASIC realm=\"OUR_DOMAIN_NAME\""
content-type: "text/html; charset=utf-8"
proxy-connection: "close"
set-cookie: "BCSI-CS-925062b0249dae29=2; Path=/"
connection: "close"
content-length: "706"
x-rbt-optimized-by: "riv-olo (RiOS 8.5.1) IK"
OAuth2::Error - Nice page from my proxy telling me that I’m not authentified on the domain

当我使用授权码使用POSTMAN REST Client发出POST请求时,一切都很好,API返回给我一个access_token。 我不明白为什么请求通过代理,因为我的所有应用程序和API都在我的localhost上。

有人可以告诉我为什么使用我的本地应用附加此错误?

由于

2 个答案:

答案 0 :(得分:1)

由于我的邮递员请求有效而不是我的应用程序,我使用Wireshark来查看它们之间的区别。 在Oauth中,我的代理参数默认使用。所以我的请求继续代理IP。 在Postman上,请求直接在localhost上发送。 所以我更改了我的客户端定义以强制空代理参数:

PROXY_URI = ''
PROXY_USER = ''
PROXY_PASSWORD = ''

def client
  OAuth2::Client.new(KEY, SECRET, site: SITE, authorize_url: '/oauth2/auth', token_url: 'http://localhost:8080/oauth2/token', connection_opts: {
    :proxy => {:uri => PROXY_URI,
               :user => PROXY_USER,
               :password => PROXY_PASSWORD}})
end

现在请求按预期发送到localhost。 它适用于本地测试,但现在我需要对我的代理变量进行条件分配。

为什么GET方法被发送到localhost而不是POST方法?这仍然是一个谜!

答案 1 :(得分:0)

听起来你正试图通过你的代理命中localhost,这是行不通的。如果您使用的是OS X:

  1. 转到系统偏好设置&gt;网络
  2. 选择您在左侧使用的连接(例如“Wi-Fi”或“以太网”)。
  3. 点击右下方的“高级...”。
  4. 转到“代理”标签。
  5. 在底部的框中​​(“绕过代理设置”),添加127.0.0.1, localhost
  6. 单击“确定”,然后单击“应用”。
  7. 完成后,OS X不应通过您的代理将请求路由到localhost,Postman应该可以正常工作。