class Oauth3
Public Class Methods
new(registrar, options={})
click to toggle source
# File lib/oauth3.rb, line 17 def initialize(registrar, options={}) # make sure all options for the OAuth module and faraday # pass all the way down @options = options @states = {} @providers = {} @clients = {} @registrar = registrar end
Public Instance Methods
get_directive(provider_uri)
click to toggle source
# File lib/oauth3.rb, line 31 def get_directive(provider_uri) if @providers[provider_uri] # and @directive.timestamp < 1.day.old return @providers[provider_uri][:directive] end registration = @registrar.get(provider_uri) dynamic = true if registration and registration['directives'] directives = registration['directives'] dynamic = false else # TODO if there's no prefix (https://), add it first # TODO if the directive is stale, refresh it http = HTTPClient.new() response = http.get_content("#{provider_uri}/oauth3.json") directives = JSON.parse(response) end @providers[provider_uri] = { provider_uri: provider_uri, directive: directives, timestamp: Time.now, dynamic: dynamic } @providers[provider_uri][:directive] end
get_oauth2_client(provider_uri)
click to toggle source
# File lib/oauth3.rb, line 59 def get_oauth2_client(provider_uri) # TODO refresh the client when refreshing the directive if @clients[provider_uri] return @clients[provider_uri] end client_options = @options.dup client_options[:site] = "" client_options[:authorize_url] = get_directive(provider_uri)['authorization_dialog']['url'] client_options[:token_url] = get_directive(provider_uri)['access_token']['url'] token_method = (get_directive(provider_uri)['access_token']['method'] || 'POST').downcase.to_sym client_options[:token_method] = token_method @clients[provider_uri] = OAuth2::Client.new( @registrar.get(provider_uri)['id'], @registrar.get(provider_uri)['secret'], client_options ) end
get_profile(provider_uri, token)
click to toggle source
# File lib/oauth3.rb, line 182 def get_profile(provider_uri, token) url = get_directive(provider_uri)['profile']['url'] OAuth2::AccessToken.new(get_oauth2_client(provider_uri), token).get(url) end
get_resource(provider_uri, token, path)
click to toggle source
# File lib/oauth3.rb, line 187 def get_resource(provider_uri, token, path) url = get_directive(provider_uri)['api_base_url'] OAuth2::AccessToken.new(get_oauth2_client(provider_uri), token).get("#{url}/#{path}") end
get_state(state)
click to toggle source
# File lib/oauth3.rb, line 167 def get_state(state) @states.delete(state) end
get_token(provider_uri, code)
click to toggle source
# File lib/oauth3.rb, line 176 def get_token(provider_uri, code) get_oauth2_client(provider_uri).auth_code.get_token(code, { redirect_uri: @options[:authorization_code_callback_uri] }) end
normalize_provider_uri(uri)
click to toggle source
# File lib/oauth3.rb, line 27 def normalize_provider_uri(uri) 'https://' + uri.gsub(/https?:\/\//, '') end
random_string()
click to toggle source
# File lib/oauth3.rb, line 80 def random_string (0...50).map { ('a'..'z').to_a[rand(26)] }.join end
validate_state(provider_uri, state)
click to toggle source
# File lib/oauth3.rb, line 171 def validate_state(provider_uri, state) # TODO delete stale states @states[state] end