class Rage::Session
“‘
brew install libsodium
“`bash
- macOS (using Homebrew):
“`
sudo yum install libsodium
“`bash
- Fedora / RHEL / Amazon Linux:
“`
sudo apt install libsodium23
“`bash
- Ubuntu / Debian:
it is installed by default; if not, install it with:
Rage sessions use libsodium (via RbNaCl) for encryption. On many Debian-based systems
## System Dependencies
“`
export SECRET_KEY_BASE=“my-secret-key”
“`bash
or via the `SECRET_KEY_BASE` environment variable:
“`
end
config.secret_key_base = “my-secret-key”
Rage.configure do |config|
“`ruby
3. Configure your application to use the generated key, either via configuration:
“`
ruby -r securerandom -e ’puts SecureRandom.hex(64)‘
“`bash
2. Generate a secret key base (keep this value private and out of version control):
“`
bundle add base64 domain_name rbnacl
“`bash
1. Add the required gems to your `Gemfile`:
## Setup
Rage sessions are encrypted using a secret key. This prevents clients from reading or tampering with session data.
authentication mechanisms for browser-based clients.
Sessions securely store data between requests using cookies and are typically one of the most convenient and secure
#
def self.key
- Private: -
def self.key @key ||= Rage.config.session.key&.to_sym || :"_#{Rage.root.basename.to_s.gsub(/\W/, "_").downcase}_session" end
def [](key)
-
key(Symbol) --
def [](key) read_session[key] end
def []=(key, value)
-
value(String) -- -
key(Symbol) --
def []=(key, value) write_session(add: { key => value }) end
def clear
def clear write_session(clear: true) end
def delete(key)
-
key(Symbol) --
def delete(key) write_session(remove: key) end
def dig(*keys)
def dig(*keys) read_session.dig(*keys) end
def each(&block)
def each(&block) read_session.each(&block) end
def empty?
def empty? read_session.empty? end
def fetch(key, default = nil, &block)
-
key(Symbol) --
def fetch(key, default = nil, &block) if default.nil? read_session.fetch(key, &block) else read_session.fetch(key, default, &block) end end
def has_key?(key)
def has_key?(key) read_session.has_key?(key) end
def initialize(cookies)
- Private: -
def initialize(cookies) @cookies = cookies.encrypted end
def inspect
def inspect "#<#{self.class.name} @session=#{to_h.inspect}" end
def read_session
def read_session @session ||= begin session_value = @cookies[self.class.key] || @cookies[Rack::RACK_SESSION.to_sym] || "{}" JSON.parse(session_value, symbolize_names: true) rescue JSON::ParserError Rage.logger.debug("Failed to parse session cookie, resetting session") {} end end
def to_hash
def to_hash read_session end
def write_session(add: nil, remove: nil, clear: nil)
def write_session(add: nil, remove: nil, clear: nil) if add read_session.merge!(add) elsif remove && read_session.has_key?(remove) read_session.reject! { |k, _| k == remove } elsif clear read_session.clear end @cookies[self.class.key] = { httponly: true, same_site: :lax, value: read_session.to_json } end