您好我正在尝试使用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上。
有人可以告诉我为什么使用我的本地应用附加此错误?
由于
答案 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:
127.0.0.1, localhost
。完成后,OS X不应通过您的代理将请求路由到localhost,Postman应该可以正常工作。