Class: Spotify::Accounts::Session

Inherits:
Object
  • Object
show all
Defined in:
lib/spotify/accounts/session.rb

Overview

A class representing an access token, with the ability to refresh.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(accounts, access_token, expires_in, refresh_token, scopes) ⇒ Session

Returns a new instance of Session.


51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/spotify/accounts/session.rb', line 51

def initialize(accounts, access_token, expires_in, refresh_token, scopes)
  unless accounts.instance_of?(Spotify::Accounts)
    raise "You need a valid Spotify::Accounts instance in order to use Spotify authentication."
  end

  @accounts = accounts
  @access_token = access_token
  @expires_in = expires_in
  @expires_at = expires_in + Time.now.to_i unless expires_in.nil?
  @refresh_token = refresh_token
  @scopes = scopes
end

Instance Attribute Details

#access_tokenObject (readonly)

Returns the value of attribute access_token


64
65
66
# File 'lib/spotify/accounts/session.rb', line 64

def access_token
  @access_token
end

#accountsObject (readonly)

Returns the value of attribute accounts


64
65
66
# File 'lib/spotify/accounts/session.rb', line 64

def accounts
  @accounts
end

#expires_inObject (readonly)

Returns the value of attribute expires_in


64
65
66
# File 'lib/spotify/accounts/session.rb', line 64

def expires_in
  @expires_in
end

#refresh_tokenObject (readonly)

Returns the value of attribute refresh_token


64
65
66
# File 'lib/spotify/accounts/session.rb', line 64

def refresh_token
  @refresh_token
end

Class Method Details

.from_authorization_code(accounts, code) ⇒ Spotify::Accounts::Session

Parse the response we collect from the authorization code.

Examples:

@session = Spotify::Accounts.from_authorization_code(@accounts, "authorization code here")

Parameters:

  • accounts (Spotify::Accounts)

    A valid instance of Spotify::Accounts.

  • code (String)

    The code provided in the Redirect URI from the Spotify Accounts API.

Returns:

See Also:

  • lib/spotify/accountslib/spotify/accounts.rb

21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/spotify/accounts/session.rb', line 21

def from_authorization_code(accounts, code)
  params = {
    client_id:     @accounts.instance_variable_get(:@client_id),
    client_secret: @accounts.instance_variable_get(:@client_secret),
    redirect_uri:  @accounts.instance_variable_get(:@redirect_uri),
    grant_type:    "authorization_code",
    code:          code
  }
  request = HTTParty.post("https://accounts.spotify.com/api/token", body: params)
  response = request.parsed_response.with_indifferent_access
  raise response[:error_description] if response[:error]
  new(accounts, response[:access_token], response[:expires_in], response[:refresh_token], response[:scope])
end

.from_refresh_token(accounts, refresh_token) ⇒ Spotify::Accounts::Session

Set up an instance of Access Token with just a refresh_token.

Examples:

@access_token = Spotify::Accounts::Session.from_refresh_token(@accounts, "refresh token here")
@access_token.force_refresh!

Parameters:

  • accounts (Spotify::Accounts)

    A valid instance of Spotify::Accounts.

  • refresh_token (String)

    A valid refresh token. You'll want to store the refresh_token in your database.

Returns:


46
47
48
# File 'lib/spotify/accounts/session.rb', line 46

def from_refresh_token(accounts, refresh_token)
  new(accounts, nil, nil, refresh_token, nil)
end

Instance Method Details

#contains_scope?(scope) ⇒ TrueClass, FalseClass

Checks if a specific scope has been granted by the user.

Examples:

@access_token.contains_scope?("user-read-top")
@access_token.contains_scope?(:"user-read-top")

Parameters:

  • scope (String, Symbol)

    The name of the scope you'd like to check. For example, “user-read-private”.

Returns:

  • (TrueClass, FalseClass)

    scope_included A true/false boolean if the scope is included.


89
90
91
# File 'lib/spotify/accounts/session.rb', line 89

def contains_scope?(scope)
  scopes.include?(scope.downcase.to_sym)
end

#expired?TrueClass, ...

Check if the access token has expired. Returns nil if no expires_in is defined.

Examples:

@session.expired?

Returns:

  • (TrueClass, FalseClass, NilClass)

    has_expired Has the access token expired?


114
115
116
117
# File 'lib/spotify/accounts/session.rb', line 114

def expired?
  return nil if expires_at.nil?
  Time.now > expires_at
end

#expires_atTime

When will the access token expire? Returns nil if no expires_in is defined.

Examples:

@session.expires_at

Returns:

  • (Time)

    time When the access token will expire.


101
102
103
104
# File 'lib/spotify/accounts/session.rb', line 101

def expires_at
  return nil if @expires_in.nil?
  Time.at(@expires_at)
end

#inspectObject

:nodoc:


168
169
170
# File 'lib/spotify/accounts/session.rb', line 168

def inspect # :nodoc:
  "#<%s:0x00%x>" % [self.class.name, (object_id << 1)]
end

#refresh!TrueClass, FalseClass

Refresh the access token.

rubocop:disable AbcSize

Examples:

@session.refresh!

Returns:

  • (TrueClass, FalseClass)

    success Have we been able to refresh the access token?


128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
# File 'lib/spotify/accounts/session.rb', line 128

def refresh!
  raise "You cannot refresh without a valid refresh_token." if @refresh_token.nil?

  params = {
    client_id:     @accounts.instance_variable_get(:@client_id),
    client_secret: @accounts.instance_variable_get(:@client_secret),
    grant_type:    "refresh_token",
    refresh_token: @refresh_token
  }
  request = HTTParty.post("https://accounts.spotify.com/api/token", body: params)
  response = request.parsed_response.with_indifferent_access

  @access_token = response[:access_token]
  @expires_in = response[:expires_in]
  @expires_at = response[:expires_in] + Time.now.to_i
  @scopes = response[:scope]

  true
rescue HTTParty::Error
  false
end

#scopesArray

Converts the space-delimited scope list to a symbolized array.

Examples:

@access_token.scopes # => [:"user-read-private", :"user-top-read", ...]

Returns:

  • (Array)

    scopes A symbolized list of scopes.


74
75
76
77
# File 'lib/spotify/accounts/session.rb', line 74

def scopes
  return [] if @scopes.nil?
  @scopes.split(" ").map(&:to_sym)
end

#to_jsonString

Export to JSON. Designed mostly for iOS, Android, or external use cases.

Examples:

@session.to_json

Returns:

  • (String)

    json The JSON output of the session instance.


159
160
161
162
163
164
165
166
# File 'lib/spotify/accounts/session.rb', line 159

def to_json
  {
    access_token:  @access_token.presence,
    expires_at:    @expires_at.presence,
    refresh_token: @refresh_token.presence,
    scopes:        scopes
  }.to_json
end