Sha256: 75db63a22476b525357be263fee9548332182888271b21977664d6a6bf3d2da7

Contents?: true

Size: 1.62 KB

Versions: 1

Compression:

Stored size: 1.62 KB

Contents

require "active_support/core_ext/object/blank"

module TinyAuth
  module Controller
    # Extract a token from a request
    # @param request [ActionDispatch::HTTP::Request]
    # @return [String,nil]
    def self.token(request)
      header = request.authorization.to_s
      header[/^Bearer (.*)$/, 1].presence
    end

    # Defines a before action that will authenticate the resource.
    # It also defines methods for accessing the currently authenticated
    # resource.
    # @param model [ActiveRecord::Base]
    # @param name [Symbol] Used to define methods like `current_user`
    # @param options [Hash] Additional arguments for `before_action`
    #
    # @example
    #   class ApplicationController < ActionController::Base
    #     extend TinyAuth::Controller
    #
    #     authenticates model: User, only: :index
    #
    #     def index
    #       if user_signed_in?
    #         render json: current_user
    #       else
    #         head :unauthorized
    #       end
    #     end
    #   end
    def authenticates(model:, name: model.model_name.singular, **options)
      authenticate = :"authenticate_#{name}"
      current = :"current_#{name}"
      current_ivar = :"@current_#{name}"
      signed_in = :"#{name}_signed_in?"

      attr_reader current

      define_method(signed_in) do
        !send(current).nil?
      end

      define_method(authenticate) do
        token = TinyAuth::Controller.token(request)

        if token
          resource = model.find_by_token(token)
          instance_variable_set(current_ivar, resource)
        end
      end

      before_action(authenticate, **options)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
tiny_auth-1.0.0 lib/tiny_auth/controller.rb