standard_id 0.26.0 → 0.26.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a0d8132ce80b99059528d033a05dc3d6ec4c421d6eaea14725e51357639f4808
4
- data.tar.gz: 2c8386bc4ea25b23e54553ed0ad3ba5816fc47efcb64003aa02252e0af54e54d
3
+ metadata.gz: 6b1486a551a57501f794685296e6d40c7c356917168fce7a515c7d869c887c1c
4
+ data.tar.gz: 9520bd31e28f591e0e5b65e95e4b8861c7fedc233471914740304984da666f6c
5
5
  SHA512:
6
- metadata.gz: e69d8a20c4419deec38b8cc3c69b51a6b99b6a6c2a9043bf0a16625bb7539faf8ebf9095856d2fcad9a6ed2eda011863ba374d7872d681dc229e6a682d273e99
7
- data.tar.gz: ed39942791e51fff0b333d9026e4707a52c8acdfffc5a40c447939b5f486d971597d3711417453bb1ecb66f736b78af607bf8bb9607c0a9ae1594139d3d4a7ff
6
+ metadata.gz: a2122cccd43faf84a5a332788f10f02a6a91928dfcc9452e080fb27704951da83dcaaffc02e0e91d7b1668b9f5696c0142b7744924908a5e03ac74c539bada1e
7
+ data.tar.gz: b287c31906e30d58e977ce778a9daa77010a346eaa355a343b0952ec82865ece850e6686b622af9f228e5f69010efd2d9e8914fbb56bd6fe7c4b497976ebb2a6
@@ -20,7 +20,14 @@ module StandardId
20
20
  }, status: :too_many_requests
21
21
  else
22
22
  flash[:alert] = "Too many requests. Please try again later."
23
- redirect_to request.referer || main_app.root_path, status: :see_other
23
+ # Bounce back to the rate-limited form's own GET action. Previously this
24
+ # used `request.referer || main_app.root_path`, which raised (→ 500) for
25
+ # two real cases: a host app that doesn't define a root route (e.g. an
26
+ # API/control-plane that only mounts the engine — `main_app.root_path`
27
+ # then doesn't exist), and a cross-origin `Referer` (Rails refuses the
28
+ # redirect as unsafe). `request.path` is always a valid, same-origin GET
29
+ # for every rate-limited action here, so it degrades gracefully.
30
+ redirect_to request.path, status: :see_other
24
31
  end
25
32
  end
26
33
  end
@@ -9,6 +9,7 @@ module StandardId
9
9
 
10
10
  include StandardId::WebEngine.routes.url_helpers
11
11
  helper StandardId::WebEngine.routes.url_helpers
12
+ helper StandardId::ApplicationHelper
12
13
 
13
14
  layout -> { StandardId.config.web_layout.presence || "application" }
14
15
 
@@ -1,4 +1,10 @@
1
1
  module StandardId
2
2
  module ApplicationHelper
3
+ # The configured OTP code length, clamped to the engine's supported range
4
+ # (4..10). Views use this so the verification-code input's `maxlength`
5
+ # stays in sync with the length of codes the generator actually produces.
6
+ def otp_code_length
7
+ StandardId::Passwordless.otp_code_length
8
+ end
3
9
  end
4
10
  end
@@ -22,7 +22,7 @@
22
22
  <div>
23
23
  <%= form.label :code, "Verification code", class: "block text-sm/6 font-medium text-gray-900 dark:text-white" %>
24
24
  <div class="mt-2">
25
- <%= form.text_field :code, required: true, autofocus: true, autocomplete: "one-time-code", inputmode: "numeric", maxlength: 6, class: "block w-full rounded-md bg-white px-3 py-1.5 text-base text-gray-900 outline outline-1 -outline-offset-1 outline-gray-300 placeholder:text-gray-400 focus:outline focus:outline-2 focus:-outline-offset-2 focus:outline-indigo-600 sm:text-sm/6 dark:bg-white/5 dark:text-white dark:outline-white/10 dark:placeholder:text-gray-500 dark:focus:outline-indigo-500" %>
25
+ <%= form.text_field :code, required: true, autofocus: true, autocomplete: "one-time-code", inputmode: "numeric", maxlength: otp_code_length, class: "block w-full rounded-md bg-white px-3 py-1.5 text-base text-gray-900 outline outline-1 -outline-offset-1 outline-gray-300 placeholder:text-gray-400 focus:outline focus:outline-2 focus:-outline-offset-2 focus:outline-indigo-600 sm:text-sm/6 dark:bg-white/5 dark:text-white dark:outline-white/10 dark:placeholder:text-gray-500 dark:focus:outline-indigo-500" %>
26
26
  </div>
27
27
  </div>
28
28
 
@@ -34,7 +34,6 @@ module StandardId
34
34
  token_endpoint: "#{base}/oauth/token",
35
35
  revocation_endpoint: "#{base}/oauth/revoke",
36
36
  userinfo_endpoint: "#{base}/userinfo",
37
- jwks_uri: "#{base}/.well-known/jwks.json",
38
37
  response_types_supported: %w[code],
39
38
  grant_types_supported: %w[authorization_code refresh_token client_credentials],
40
39
  subject_types_supported: %w[public],
@@ -47,6 +46,14 @@ module StandardId
47
46
  code_challenge_methods_supported: %w[S256]
48
47
  }
49
48
 
49
+ # Only advertise jwks_uri when signing is asymmetric. With symmetric
50
+ # (HS256/384/512) signing there are no public keys to publish, so the
51
+ # jwks endpoint deliberately returns 404 — advertising it would point
52
+ # clients at a dead URL. HS-signed tokens are verified with the shared
53
+ # secret, not JWKS. (RFC 8414 makes jwks_uri optional; an OIDC client
54
+ # using HS256 id_tokens verifies them with the client_secret.)
55
+ doc[:jwks_uri] = "#{base}/.well-known/jwks.json" if StandardId::JwtService.asymmetric?
56
+
50
57
  doc[:registration_endpoint] = "#{base}/oauth/register" if registration_enabled
51
58
 
52
59
  doc
@@ -1,3 +1,3 @@
1
1
  module StandardId
2
- VERSION = "0.26.0"
2
+ VERSION = "0.26.1"
3
3
  end
@@ -63,7 +63,12 @@ module StandardId
63
63
  # TODO: make token key names configurable
64
64
  session.delete(:session_token)
65
65
  session.delete(:standard_id_scopes)
66
- cookies.encrypted[:session_token] = nil
66
+ # Delete the cookie outright. Assigning `cookies.encrypted[:session_token] = nil`
67
+ # writes a fresh encrypted blob through the jar's default options (no httponly)
68
+ # on every unauthenticated request, leaving a confusing non-HttpOnly
69
+ # `session_token` cookie that carries no real token. `cookies.delete` removes it
70
+ # cleanly — the token-bearing write (write_session_cookie) keeps httponly: true.
71
+ cookies.delete(:session_token)
67
72
  cookies.delete(:remember_token)
68
73
 
69
74
  Current.session = nil
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: standard_id
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.26.0
4
+ version: 0.26.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jaryl Sim