diff --git a/README.markdown b/README.markdown index a432952..eacd3a0 100644 --- a/README.markdown +++ b/README.markdown @@ -10,7 +10,7 @@ RubyBox provides a simple, chainable, feature-rich client for [Box's 2.0 API](ht Authorization ------------- -RubyBox uses Box's OAuth2 Implementaton, Here are the steps involved in authorizing a client: +RubyBox uses Box's OAuth2 Implementation, Here are the steps involved in authorizing a client: __1)__ Get the authorization url. @@ -25,40 +25,57 @@ session = RubyBox::Session.new({ authorize_url = session.authorize_url('https://redirect-url-in-app-settings') ``` -__2)__ After redirecting to the authorize_url, exchange the _code_ given for an _access\_token_ +__2)__ After redirecting to the authorize_url, exchange the `code` given for an `access_token` ```ruby @token = session.get_access_token('code-returned-to-redirect_url') p '@token.token' # the access token. p '@token.refresh_token' # token that can be exchanged for a new access_token once the access_token expires. - -# refreshing token. - -session = RubyBox::Session.new({ - client_id: 'your-client-id', - client_secret: 'your-client-secret', - access_token: 'original-access-token' -}) - -# you need to persist this somehow. the refresh token will change every time you use it -@token = session.refresh_token('your-refresh-token') -save_me_somehow(@token.refresh_token) ``` +See [Storing Tokens](storing_token) for important information on persisting these tokens. -__3)__ Create a client using a session initialized with the _access\_token_. +__3)__ Create a client using a session initialized with the `access_token` and `refresh_token`. ```ruby require 'ruby-box' -session = RubyBox::Session.new({ +session = MyBoxSession.new({ client_id: 'your-client-id', client_secret: 'your-client-secret', - access_token: 'access-token' + access_token: 'access-token', + refresh_token: 'refresh-token' }) client = RubyBox::Client.new(session) ``` +Storing Tokens +===== +Box.com tokens are short lived. Once they expire, the refresh_token may be used _once_ to issue a new access_token +and refresh_token pair. It is important to securely persist theses initially as well as any time a refresh token +is used to issue new tokens. + +ruby-box will automatically attempt to refresh the token if it receives a response that the access_token is expired. +Subclassing Session will allow you to save the new tokens: + +```ruby +class MyBoxSession < RubyBox::Session + # override call to refresh token so we can update the tokens store + def refresh_token(refresh_token) + ut = MyTokens.where(refresh_token: refresh_token, provider: 'box').first + begin + super + ut.access_token = @access_token.token + ut.refresh_token = @access_token.refresh_token + ut.save! + rescue OAuth2::Error => e + # token pair must just be bad + ut.destroy + end + end +end +``` + Usage =====