Class: Users::QrData::Verify
- Inherits:
-
Object
- Object
- Users::QrData::Verify
- 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
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] login = payload['login'] # we don't reveal whether user exists or not in error messages for security reasons. user = Spree::User.find_by(login: 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 |