Module: BetterAuth::Passkey::Challenges

Defined in:
lib/better_auth/passkey/challenges.rb

Constant Summary collapse

CHALLENGE_MAX_AGE =
60 * 5

Class Method Summary collapse

Class Method Details



41
42
43
# File 'lib/better_auth/passkey/challenges.rb', line 41

def challenge_cookie(ctx, config)
  ctx.context.create_auth_cookie(config.dig(:advanced, :web_authn_challenge_cookie), max_age: CHALLENGE_MAX_AGE)
end

.challenge_token(ctx, config) ⇒ Object



37
38
39
# File 'lib/better_auth/passkey/challenges.rb', line 37

def challenge_token(ctx, config)
  ctx.get_signed_cookie(challenge_cookie(ctx, config).name, ctx.context.secret)
end

.find_challenge(ctx, verification_token) ⇒ Object



28
29
30
31
32
33
34
35
# File 'lib/better_auth/passkey/challenges.rb', line 28

def find_challenge(ctx, verification_token)
  verification = ctx.context.internal_adapter.find_verification_value(verification_token)
  return nil if verification.nil? || BetterAuth::Routes.expired_time?(verification["expiresAt"] || verification[:expiresAt])

  JSON.parse(verification.fetch("value") { verification.fetch(:value) })
rescue JSON::ParserError
  nil
end

.store_challenge(ctx, config, challenge, user_id) ⇒ Object



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/better_auth/passkey/challenges.rb', line 12

def store_challenge(ctx, config, challenge, user_id)
  user_data = user_id.is_a?(Hash) ? user_id : {id: user_id}
  verification_token = Crypto.random_string(32)
  cookie = challenge_cookie(ctx, config)
  ctx.set_signed_cookie(cookie.name, verification_token, ctx.context.secret, cookie.attributes.merge(max_age: CHALLENGE_MAX_AGE))
  ctx.context.internal_adapter.create_verification_value(
    identifier: verification_token,
    value: JSON.generate({
      expectedChallenge: challenge,
      userData: user_data,
      context: BetterAuth::Passkey::Utils.normalize_hash(ctx.query)[:context]
    }),
    expiresAt: Time.now + CHALLENGE_MAX_AGE
  )
end