Sha256: 816a4527cd68a028633c8ffd11199f8f638b1f4d7ea72dbb279e3001a7690339

Contents?: true

Size: 1.76 KB

Versions: 10

Compression:

Stored size: 1.76 KB

Contents

# frozen_string_literal: true

module Admin
  class TokensController < ApplicationController
    include Koi::Controller::JsonWebToken

    skip_before_action :authenticate_admin, only: %i[show update]
    before_action :set_token, only: %i[show update]

    def create
      admin = Admin::User.find(params[:id])
      token = encode_token(admin_id: admin.id, exp: 5.minutes.from_now.to_i, iat: Time.current.to_i)

      render locals: { token: }
    end

    def update
      return redirect_to admin_dashboard_path, status: :see_other if admin_signed_in?

      return redirect_to new_admin_session_path, status: :see_other, notice: "invalid token" if @token.blank?

      admin = Admin::User.find(@token[:admin_id])
      sign_in_admin(admin)

      redirect_to admin_admin_user_path(admin)
    end

    def show
      return redirect_to new_admin_session_path, notice: "Token invalid or consumed already" if @token.blank?

      admin = Admin::User.find(@token[:admin_id])

      if token_utilised?(admin, @token)
        return redirect_to new_admin_session_path, notice: "Token invalid or consumed already"
      end

      render locals: { admin:, token: params[:token] }, layout: "koi/login"
    end

    private

    def set_token
      @token = decode_token(params[:token])
    end

    def token_utilised?(admin, token)
      admin.current_sign_in_at.present? || (admin.last_sign_in_at.present? && admin.last_sign_in_at.to_i > token[:iat])
    end

    def sign_in_admin(admin)
      admin.current_sign_in_at = Time.current
      admin.current_sign_in_ip = request.remote_ip
      admin.sign_in_count      = 1

      # disable validations to allow saving without password or passkey credentials
      admin.save!(validate: false)
      session[:admin_user_id] = admin.id
    end
  end
end

Version data entries

10 entries across 10 versions & 1 rubygems

Version Path
katalyst-koi-4.7.3 app/controllers/admin/tokens_controller.rb
katalyst-koi-4.6.0 app/controllers/admin/tokens_controller.rb
katalyst-koi-4.5.9 app/controllers/admin/tokens_controller.rb
katalyst-koi-4.5.8 app/controllers/admin/tokens_controller.rb
katalyst-koi-4.5.7 app/controllers/admin/tokens_controller.rb
katalyst-koi-4.5.6 app/controllers/admin/tokens_controller.rb
katalyst-koi-4.5.5 app/controllers/admin/tokens_controller.rb
katalyst-koi-4.5.4 app/controllers/admin/tokens_controller.rb
katalyst-koi-4.5.3 app/controllers/admin/tokens_controller.rb
katalyst-koi-4.5.2 app/controllers/admin/tokens_controller.rb