Class: Users::QrData::Verify

Inherits:
Object
  • Object
show all
Includes:
Spree::ServiceModule::Base
Defined in:
app/services/spree_cm_commissioner/users/qr_data/verify.rb

Instance Method Summary collapse

Instance Method Details

#call(qr_data:) ⇒ Object



6
7
8
9
10
11
12
13
# File 'app/services/spree_cm_commissioner/users/qr_data/verify.rb', line 6

def call(qr_data:)
  user = find_and_verify_by!(qr_data: qr_data)
  success(user) if user.present?
rescue JWT::ExpiredSignature
  failure(:expired_qr_data, 'Provided QR code has expired')
rescue JWT::DecodeError, JWT::VerificationError
  failure(:invalid_qr_data, 'Provided QR code is invalid')
end

#find_and_verify_by!(qr_data:) ⇒ Object

Raises:

  • (JWT::DecodeError)


15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'app/services/spree_cm_commissioner/users/qr_data/verify.rb', line 15

def find_and_verify_by!(qr_data:)
  decoded_token = JWT.decode(qr_data, nil, false)
  payload = decoded_token[0]
   = payload['login']

  # we don't reveal whether user exists or not in error messages for security reasons.
  user = Spree::User.find_by(login: )
  raise JWT::DecodeError, 'QR code is invalid' if user.nil?

  JWT.decode(qr_data, user.secure_token, true, { algorithm: 'HS256' })

  # Validate version to ensure QR code hasn't been invalidated
  raise JWT::VerificationError, 'QR code has been invalidated' if payload['ver'] != user.qr_data_version

  user
end