class Spotify::Accounts::Session
A class representing an access token, with the ability to refresh.
Attributes
Public Class Methods
Set up an instance of Access Token with just a refresh_token.
@example
@access_token = Spotify::Accounts::Session.from_refresh_token(@accounts, "refresh token here") @access_token.force_refresh!
@param [Spotify::Accounts] accounts A valid instance of Spotify::Accounts
. @param [String] refresh_token
A valid refresh token. You'll want to store the refresh_token
in your database. @return [Spotify::Accounts::Session] access_token
An instance of Spotify::Accounts::Session
# File lib/spotify/accounts/session.rb, line 46 def from_refresh_token(accounts, refresh_token) new(accounts, nil, nil, refresh_token, nil) end
# 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
Public Instance Methods
Checks if a specific scope has been granted by the user.
@example
@access_token.contains_scope?("user-read-top") @access_token.contains_scope?(:"user-read-top")
@param [String,Symbol] scope The name of the scope you'd like to check. For example, “user-read-private”. @return [TrueClass,FalseClass] scope_included A true/false boolean if the scope is included.
# File lib/spotify/accounts/session.rb, line 89 def contains_scope?(scope) scopes.include?(scope.downcase.to_sym) end
Check if the access token has expired. Returns nil if no expires_in
is defined.
@example
@session.expired?
@return [TrueClass,FalseClass,NilClass] has_expired Has the access token expired?
# File lib/spotify/accounts/session.rb, line 114 def expired? return nil if expires_at.nil? Time.now > expires_at end
When will the access token expire? Returns nil if no expires_in
is defined.
@example
@session.expires_at
@return [Time] time When the access token will expire.
# File lib/spotify/accounts/session.rb, line 101 def expires_at return nil if @expires_in.nil? Time.at(@expires_at) end
Refresh the access token.
@example
@session.refresh!
@return [TrueClass,FalseClass] success Have we been able to refresh the access token?
rubocop:disable AbcSize
# 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
Converts the space-delimited scope list to a symbolized array.
@example
@access_token.scopes # => [:"user-read-private", :"user-top-read", ...]
@return [Array] scopes A symbolized list of scopes.
# File lib/spotify/accounts/session.rb, line 74 def scopes return [] if @scopes.nil? @scopes.split(" ").map(&:to_sym) end
Export to JSON. Designed mostly for iOS, Android, or external use cases.
@example
@session.to_json
@return [String] json The JSON output of the session instance.
# 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