Class: EeIdVerification::Verifier

Inherits:
Object
  • Object
show all
Defined in:
lib/ee_id_verification.rb

Overview

Main verifier class

Instance Method Summary collapse

Constructor Details

#initializeVerifier

Initialize the verifier



39
40
41
42
# File 'lib/ee_id_verification.rb', line 39

def initialize
  @reader = CertificateReader.new
  @sessions = {}
end

Instance Method Details

#authenticateAuthenticationSession

Start authentication process

Returns:

Raises:



52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/ee_id_verification.rb', line 52

def authenticate
  raise Error, "No Estonian ID card detected" unless available?

  session = AuthenticationSession.new(
    id: SecureRandom.hex(16),
    method: :digidoc_local,
    status: :waiting_for_pin,
    created_at: Time.now,
    expires_at: Time.now + 300
  )

  @sessions[session.id] = session
  session
end

#available?Boolean

Check if Estonian ID card authentication is available

Returns:

  • (Boolean)

    true if card and reader are present



46
47
48
# File 'lib/ee_id_verification.rb', line 46

def available?
  @reader.card_present?
end

#complete_authentication(session, pin) ⇒ AuthenticationResult

Complete authentication with PIN

Parameters:

Returns:



71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/ee_id_verification.rb', line 71

def complete_authentication(session, pin)
  stored_session = @sessions[session.id]
  return failed_result(session.id, "Session not found") unless stored_session
  return failed_result(session.id, "Session expired") if session.expired?

  begin
    @reader.connect
    cert = @reader.read_auth_certificate(pin)
    personal_data = @reader.extract_personal_data(cert)

    @sessions.delete(session.id)

    AuthenticationResult.new(
      session_id: session.id,
      status: :completed,
      authenticated: true,
      personal_code: personal_data[:personal_code],
      given_name: personal_data[:given_name],
      surname: personal_data[:surname],
      country: personal_data[:country]
    )
  rescue StandardError => e
    failed_result(session.id, e.message)
  ensure
    begin
      @reader.disconnect
    rescue StandardError
      nil
    end
  end
end