module Zaikio::OAuthClient::Authenticatable

Public Instance Methods

approve() click to toggle source
# File lib/zaikio/oauth_client/authenticatable.rb, line 20
def approve  # rubocop:disable Metrics/MethodLength,Metrics/AbcSize
  if params[:error].present?
    redirect_to send(
      respond_to?(:error_path_for) ? :error_path_for : :default_error_path_for,
      params[:error],
      description: params[:error_description]
    ) and return
  end

  if session[:state].present? && params[:state] != session[:state]
    return redirect_to send(
      respond_to?(:error_path_for) ? :error_path_for : :default_error_path_for,
      "invalid_state"
    )
  end

  access_token = create_access_token

  origin = session[:origin]
  session.delete(:origin)

  session[:zaikio_access_token_id] = access_token.id unless access_token.organization?

  redirect_to send(
    respond_to?(:after_approve_path_for) ? :after_approve_path_for : :default_after_approve_path_for,
    access_token, origin
  )
end
destroy() click to toggle source
# File lib/zaikio/oauth_client/authenticatable.rb, line 49
def destroy
  access_token_id = session[:zaikio_access_token_id]
  session.delete(:zaikio_access_token_id)
  session.delete(:origin)

  redirect_to send(
    respond_to?(:after_destroy_path_for) ? :after_destroy_path_for : :default_after_destroy_path_for,
    access_token_id
  )
end
new() click to toggle source
# File lib/zaikio/oauth_client/authenticatable.rb, line 6
def new
  opts = params.permit(:client_name, :show_signup, :prompt, :prompt_email_confirmation,
                       :force_login, :state, :lang)
  opts[:lang] ||= I18n.locale if defined?(I18n)
  client_name = opts.delete(:client_name)
  opts[:state] ||= session[:state] = SecureRandom.urlsafe_base64(32)

  redirect_to oauth_client.auth_code.authorize_url(
    redirect_uri: approve_url(client_name),
    scope: oauth_scope,
    **opts
  )
end

Private Instance Methods

approve_url(client_name = nil) click to toggle source
# File lib/zaikio/oauth_client/authenticatable.rb, line 62
def approve_url(client_name = nil)
  zaikio_oauth_client.approve_session_url(client_name)
end
client_config() click to toggle source
# File lib/zaikio/oauth_client/authenticatable.rb, line 83
def client_config
  client_config = Zaikio::OAuthClient.configuration.find!(client_name)
  client_config = client_config.org_config if use_org_config?

  client_config or raise ActiveRecord::RecordNotFound
end
client_name() click to toggle source
# File lib/zaikio/oauth_client/authenticatable.rb, line 79
def client_name
  params[:client_name] || Zaikio::OAuthClient.configuration.all_client_names.first
end
create_access_token() click to toggle source
# File lib/zaikio/oauth_client/authenticatable.rb, line 70
def create_access_token
  access_token_response = oauth_client.auth_code.get_token(params[:code])

  Zaikio::AccessToken.build_from_access_token(
    access_token_response,
    requested_scopes: client_config.default_scopes
  ).tap(&:save!)
end
default_after_approve_path_for(access_token, origin) click to toggle source
# File lib/zaikio/oauth_client/authenticatable.rb, line 98
def default_after_approve_path_for(access_token, origin)
  session[:zaikio_person_id] = access_token.bearer_id unless access_token.organization?

  origin || main_app.root_path
end
default_after_destroy_path_for(_access_token_id) click to toggle source
# File lib/zaikio/oauth_client/authenticatable.rb, line 104
def default_after_destroy_path_for(_access_token_id)
  session.delete(:origin)

  main_app.root_path
end
default_error_path_for(error_code, description: nil) click to toggle source
# File lib/zaikio/oauth_client/authenticatable.rb, line 110
def default_error_path_for(error_code, description: nil)
  raise Zaikio::OAuthClient::InvalidScopesError, description if error_code == "invalid_scope"

  unless error_code == "access_denied"
    flash[:alert] = I18n.t("zaikio.oauth_client.error_occured", error: error_code, description: description)
  end

  main_app.root_path
end
oauth_client() click to toggle source
# File lib/zaikio/oauth_client/authenticatable.rb, line 90
def oauth_client
  Zaikio::OAuthClient.for(client_name)
end
oauth_scope() click to toggle source
# File lib/zaikio/oauth_client/authenticatable.rb, line 94
def oauth_scope
  client_config.scopes_for_auth(params[:organization_id]).join(",")
end
use_org_config?() click to toggle source
# File lib/zaikio/oauth_client/authenticatable.rb, line 66
def use_org_config?
  false
end