# frozen_string_literal: true # В модуле сгруппированы методы отвечающие за аутентификацию # module Authentication extend ActiveSupport::Concern included do before_action :authenticate_request attr_reader :access_token private def authenticate_request raise AuthenticationError unless access_token end def access_token @access_token ||= decode(http_auth_header) end def http_auth_header request.headers["Authorization"]&.split(" ")&.last end def decode(token) decoded_token = JWT.decode(token, secret_key, true, algorithm: "RS256") HashWithIndifferentAccess.new(decoded_token[0]) end def secret_key secret_key_file_open { |f| OpenSSL::PKey::RSA.new(f) } end def secret_key_file_open(&block) File.open(ENV['JWT_SECRET_PATH'], &block) end end # Используется для сигнализации ошибки во время аутентификации # class AuthenticationError < StandardError attr_reader :param def initialize(param) @param = param super("Ошибка аутентификации: #{param}") end end end