clowk 0.9.0 → 0.10.0

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: a1fa17ef38ffc2cce253e598ab2c2478ba05f5f7c638601ec833bafa00377ebc
4
- data.tar.gz: 396b0e5c36dcaa01a10397f6227af24dcdf5274a06145222da54855aba71a076
3
+ metadata.gz: 6bd80a8d0998a7b4779bb719e51a1d31c394cd53a5ea3a46b56cd2206213a949
4
+ data.tar.gz: 71846822f9bdf17b29357e55266480d5a352f970cd3aa0b256ffc89599277a73
5
5
  SHA512:
6
- metadata.gz: 1fd3f7de008dd50644494e85e0771113ae98be1efdc1abcae7d97888b6af84f7aa2f5fd086aa711d3be4b2984b0a626c9bdddc5d66c6c8bc41955b21325c3717
7
- data.tar.gz: 36067b774a1d57d833909bcee4316d29a25ee5a907b03063f8ee52545adbf36b09a9857b4b374065a60956f2a5a386044138592b9643e0cf5a7b2f48dec50da8
6
+ metadata.gz: d5b8fcb5938dc7cb1034a7dae4a2aec1e9dbd36cdc4ad2972f43ec99a22cf66e76779e3de3ce826a38bfd24b5add840732b5e05ae34c9b198f1fe1f506640503
7
+ data.tar.gz: d7adc93a749be711889b792d20c0c9f7e0d280768a40104d149be7ad71902c90052d562704018bde2ac119b9529e82da3d5aac80813387a50d56550fa96f8441
data/README.md CHANGED
@@ -274,28 +274,30 @@ Both ends — the broker said inactive, the ceiling passed — go through
274
274
 
275
275
  ### Where the token is kept
276
276
 
277
- Clowk writes the token to its own cookie, and — by default, as every version
278
- before 0.9 did — mirrors a copy into the app's Rails session.
277
+ Clowk writes the token to its own cookie. The setting decides one thing: whether
278
+ a copy is **also** mirrored into the host app's Rails session.
279
279
 
280
280
  ```ruby
281
- config.token_store = :cookie # Clowk's cookie only
282
- config.token_store = :session # also mirrored into the session (the default)
281
+ config.token_store = nil # Clowk's own cookie, and nowhere else (the default)
282
+ config.token_store = :app # also mirrored into the app's Rails session
283
283
  ```
284
284
 
285
- The copy is not free. A Rails session lives in **one** cookie with about 4096
286
- bytes to its name, and in production, where tokens are RS256, the token is most
287
- of what a session weighs. Hand a browser more than it will hold and it discards
288
- the whole cookie in silence — no error server-side, none in the console, the
289
- previous cookie simply stays. Everything written on that request goes with it: a
290
- flash message, a selected tenant, a CSRF rotation. What a person sees is a button
291
- that does nothing.
285
+ The copy is not free, which is why `nil` is the default. A Rails session lives in
286
+ **one** cookie with about 4096 bytes to its name, and in production, where tokens
287
+ are RS256, the token is most of what a session weighs. Hand a browser more than
288
+ it will hold and it discards the whole cookie in silence — no error server-side,
289
+ none in the console, the previous cookie simply stays. Everything written on that
290
+ request goes with it: a flash message, a selected tenant, a CSRF rotation. What a
291
+ person sees is a button that does nothing. An app pays that risk on every request
292
+ to keep a copy of a token it already has.
292
293
 
293
- Under `:cookie` the session keeps the claims and the sign-in time, nothing else.
294
+ Under `nil` the session keeps the claims and the sign-in time, nothing else.
294
295
  `current_token` reads Clowk's cookie instead, which is where an API-only app has
295
- always read it from. Sessions written before the switch are pruned on their next
296
+ always read it from. Sessions written before the upgrade are pruned on their next
296
297
  request, so an app does not have to wait for everyone to sign out.
297
298
 
298
- The default stays `:session` so an upgrade changes nothing until you ask.
299
+ Ask for `:app` if the app reads the token out of `session[...]` itself rather
300
+ than through `current_token`.
299
301
 
300
302
  ### Token verification
301
303
 
@@ -97,9 +97,9 @@ module Clowk
97
97
  end
98
98
  end
99
99
 
100
- # The session first, which holds a copy only under token_store :session —
101
- # and, for one request after an app switches to :cookie, in a session
102
- # written before the switch. drop_mirrored_token! clears those. Clowk's own
100
+ # The session first, which holds a copy only under token_store :app —
101
+ # and, for one request after an app drops that setting, in a session
102
+ # written before the change. drop_mirrored_token! clears those. Clowk's own
103
103
  # cookie is the source either way.
104
104
  def current_token
105
105
  stored_session&.dig("token") || extracted_token
@@ -321,7 +321,7 @@ module Clowk
321
321
  claims = {user: payload, signed_in_at: Time.now.to_i}
322
322
 
323
323
  store[Clowk.config.session_key] =
324
- (Clowk.config.token_store == :cookie) ? claims : claims.merge(token:)
324
+ (Clowk.config.token_store == :app) ? claims.merge(token:) : claims
325
325
 
326
326
  clowk_cookie_jar&.[]=(Clowk.config.cookie_key, {
327
327
  value: token,
@@ -331,13 +331,13 @@ module Clowk
331
331
  })
332
332
  end
333
333
 
334
- # A session written under :session still carries the token, and
334
+ # A session written under :app still carries the token, and
335
335
  # persist_clowk_session does not run again while that session stands — so
336
- # without this, switching an app to :cookie would shrink nothing until every
336
+ # without this, an app that drops :app would shrink nothing until every
337
337
  # person signed out and back in. Drops the copy once, on the first request
338
- # after the switch.
338
+ # after the change.
339
339
  def drop_mirrored_token!
340
- return unless Clowk.config.token_store == :cookie
340
+ return if Clowk.config.token_store == :app
341
341
 
342
342
  store = clowk_session_store
343
343
  held = stored_session
@@ -66,24 +66,26 @@ module Clowk
66
66
  # the next request; max_session_age is what bounds that.
67
67
  @fail_open_on_broker_error = true
68
68
 
69
- # Where the token is kept for the next request: :session or :cookie.
69
+ # Whether the token is ALSO mirrored into the host app's Rails session:
70
+ # nil for no, :app for yes.
70
71
  #
71
72
  # Clowk's own cookie is written either way — it is what `current_token`
72
73
  # reads when the session has none, and the only place an API-only app has
73
- # ever had. The setting decides whether a COPY is also mirrored into the
74
- # app's Rails session, as every version before 0.9 did.
74
+ # ever had. That is why nil is not "nowhere": it is Clowk's cookie alone.
75
75
  #
76
- # That copy is not free. A Rails session lives in ONE cookie with about
77
- # 4096 bytes to its name, and in production, where tokens are RS256, the
78
- # token is most of what a session weighs. Hand a browser more than it will
79
- # hold and it discards the whole cookie in silence: no error server-side,
80
- # none in the console, the previous cookie simply stays. Everything written
81
- # on that request goes with it — a flash message, a selected tenant — which
82
- # reads as a button that does nothing.
76
+ # The copy is not free, which is why nil is the default. A Rails session
77
+ # lives in ONE cookie with about 4096 bytes to its name, and in
78
+ # production, where tokens are RS256, the token is most of what a session
79
+ # weighs. Hand a browser more than it will hold and it discards the whole
80
+ # cookie in silence: no error server-side, none in the console, the
81
+ # previous cookie simply stays. Everything written on that request goes
82
+ # with it — a flash message, a selected tenant — which reads as a button
83
+ # that does nothing. An app pays that risk on every request to keep a copy
84
+ # of a token it already has.
83
85
  #
84
- # :session stays the default so an upgrade changes nothing until an app
85
- # asks for :cookie.
86
- @token_store = :session
86
+ # :app is there for an app that reads the token out of `session[...]`
87
+ # itself, rather than through `current_token`.
88
+ @token_store = nil
87
89
  end
88
90
 
89
91
  # Where API-only apps cache session status, since they have no Rails session
data/lib/clowk/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Clowk
4
- VERSION = "0.9.0"
4
+ VERSION = "0.10.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: clowk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Clowk