Class: Basecamp::OauthTokenProvider

Inherits:
Object
  • Object
show all
Includes:
TokenProvider
Defined in:
lib/basecamp/oauth_token_provider.rb

Overview

A token provider that supports OAuth token refresh.

Examples:

provider = Basecamp::OauthTokenProvider.new(
  access_token: "current-token",
  refresh_token: "refresh-token",
  client_id: "your-client-id",
  client_secret: "your-client-secret"
)

Constant Summary collapse

TOKEN_URL =

Token endpoint for Basecamp OAuth

"https://launchpad.37signals.com/authorization/token"

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(access_token:, client_id:, client_secret:, refresh_token: nil, expires_at: nil, on_refresh: nil) ⇒ OauthTokenProvider

Returns a new instance of OauthTokenProvider.

Parameters:

  • access_token (String)

    current access token

  • refresh_token (String, nil) (defaults to: nil)

    refresh token for renewal

  • client_id (String)

    OAuth client ID

  • client_secret (String)

    OAuth client secret

  • expires_at (Time, nil) (defaults to: nil)

    token expiration time

  • on_refresh (Proc, nil) (defaults to: nil)

    callback when tokens refresh



35
36
37
38
39
40
41
42
43
# File 'lib/basecamp/oauth_token_provider.rb', line 35

def initialize(access_token:, client_id:, client_secret:, refresh_token: nil, expires_at: nil, on_refresh: nil)
  @access_token = access_token
  @refresh_token = refresh_token
  @client_id = client_id
  @client_secret = client_secret
  @expires_at = expires_at
  @on_refresh = on_refresh
  @mutex = Mutex.new
end

Instance Attribute Details

#expires_atTime? (readonly)

Returns when the access token expires.

Returns:

  • (Time, nil)

    when the access token expires



23
24
25
# File 'lib/basecamp/oauth_token_provider.rb', line 23

def expires_at
  @expires_at
end

#on_refreshProc?

Callback invoked when tokens are refreshed.

Returns:

  • (Proc, nil)


27
28
29
# File 'lib/basecamp/oauth_token_provider.rb', line 27

def on_refresh
  @on_refresh
end

#refresh_tokenString? (readonly)

Returns the current refresh token.

Returns:

  • (String, nil)

    the current refresh token



20
21
22
# File 'lib/basecamp/oauth_token_provider.rb', line 20

def refresh_token
  @refresh_token
end

Instance Method Details

#access_tokenString

Returns the current access token, refreshing if expired.

Returns:

  • (String)


47
48
49
50
51
52
# File 'lib/basecamp/oauth_token_provider.rb', line 47

def access_token
  @mutex.synchronize do
    refresh_if_needed
    @access_token
  end
end

#expired?Boolean

Returns true if the access token is expired.

Returns:

  • (Boolean)

    true if the access token is expired



70
71
72
# File 'lib/basecamp/oauth_token_provider.rb', line 70

def expired?
  @expires_at && Time.now >= @expires_at
end

#refreshBoolean

Refreshes the access token using the refresh token.

Returns:

  • (Boolean)

    true if refresh succeeded



56
57
58
59
60
61
62
# File 'lib/basecamp/oauth_token_provider.rb', line 56

def refresh
  @mutex.synchronize do
    return false unless refreshable?

    perform_refresh
  end
end

#refreshable?Boolean

Returns true if refresh token is available.

Returns:

  • (Boolean)

    true if refresh token is available



65
66
67
# File 'lib/basecamp/oauth_token_provider.rb', line 65

def refreshable?
  @refresh_token && !@refresh_token.empty?
end