Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
An Vo edited this page Jul 14, 2020 · 2 revisions

Advanced configurations for specific cases.

Slow Oauth providers

When connect to slow oauth providers or slow network, we may encounter Net::ReadTimeout exception. In this case, pass additional connection options to OAuth2::Client to extend timeout as below.

client = OAuth2::Client.new(client_id, client_secret,
 site: '',
 connection_opts: { request: { timeout: 300 } })

connection_opts[:request][:timeout] open/read timeout in seconds. Ref Faraday custom usage.

Default Faraday adapter use Net::HTTP which has timeout 60 seconds.

Custom response parsing

Default parser

By default, responses from OAuth providers will be parsed to hash, depend on their Content-Type. Supported content type:

# Parse as JSON:
 application/json
 text/javascript
 application/hal+json
 application/vnd.collection+json
 application/vnd.api+json
# i.e.
'{"access_token": "aaaaaaaa", "additional_data": "additional"}'
=> {"access_token"=>"aaaaaaaa", "additional_data"=>"additional"}
# Parse as XML:
 text/xml
 application/rss+xml
 application/rdf+xml
 application/atom+xml
 application/xml
# i.e.
'<access_token>aaaaaaaa</access_token>'
=> {"access_token"=>"aaaaaaaa"}
# Parse as query string
 application/x-www-form-urlencoded
# i.e.
"access_token=aaaaaaaa&additional_data=additional"
=> {"access_token"=>"aaaaaaaa", "additional_data"=>"additional"}
# Return whole body as parsed content 
 text/plain

If failed to parse, parser will return whole response body, which may cause exception on layers above if they try to get access token from parsed response.

Custom parser

To enforce parser, pass :parse option to #get_token. By this, oauth2 will ignore Content-Type and use configured parser.

client.auth_code.get_token(auth_code, redirect_uri: redirect_uri, parse: :query)

:parse accepts built-in parsers similar to use Content-type above:

  • :xml - parse response body as XML.
  • :json - parse response body as JSON.
  • :query - parse response body as query string.
  • :text - parse response body as text/plain.

Besides, :parse also accepts a Proc/callable object to manually parse response body. This parser proc should return a hash contains access_token.

e.g. If whole response body is access token, the code below will build access_token object.

parser = Proc.new do |body, _response|
 {access_token: body}
end
client.auth_code.get_token(auth_code, redirect_uri: redirect_uri, parse: parser)

Moreover, if you frequently use a custom proc parser or have parser for new Content-type, you should register your new parser to avoid keep define proc. In rails, initializer is a good place to register.

e.g.

OAuth2::Response.register_parser(:mytext, ['text/plain', 'application/custom-text-content-type']) do |body|
 {access_token: body}
end
# Then
client.auth_code.get_token(auth_code, redirect_uri: redirect_uri, parse: :mytext)
# Or just remove it if OAuth provider return `Content-Type: application/custom-text-content-type`. 
client.auth_code.get_token(auth_code, redirect_uri: redirect_uri)

Debugging

To get response body or Content-Type to determine correct parser, set ENV['OAUTH_DEBUG'] == 'true' before performing request. Once enabled, faraday will log response info.

I, [...] INFO -- request: GET https://api.example.com/success
I, [...] INFO -- request: User-Agent: "Faraday v1.0.1"
I, [...] INFO -- response: Status 200
I, [...] INFO -- response: Content-Type: "text/awesome"
I, [...] INFO -- response: yay
Clone this wiki locally

AltStyle γ«γ‚ˆγ£γ¦ε€‰ζ›γ•γ‚ŒγŸγƒšγƒΌγ‚Έ (->γ‚ͺγƒͺγ‚ΈγƒŠγƒ«) /