lib/tynn/session.rb in tynn-0.0.4 vs lib/tynn/session.rb in tynn-1.0.0.rc1
- old
+ new
@@ -1,14 +1,85 @@
+# Adds simple cookie based session management. If a secret token is
+# given, it signs the cookie data to ensure that it cannot be altered
+# by unauthorized means.
+#
+# ```
+# require "tynn"
+# require "tynn/session"
+#
+# Tynn.helpers(Tynn::Session, secret: "__change_me__")
+#
+# Tynn.define do
+# root do
+# res.write(sprintf("hei %s", session[:username]))
+# end
+#
+# on(:username) do |username|
+# session[:username] = username
+# end
+# end
+# ```
+#
+# The following command generates a cryptographically secure secret ready
+# to use:
+#
+# ```
+# $ ruby -r securerandom -e "puts SecureRandom.hex(64)"
+# ```
+#
+# It's important to keep the token secret. Knowing the token allows an
+# attacker to tamper the data. So, it's recommended to load the token
+# from the environment.
+#
+# ```
+# Tynn.helpers(Tynn::Session, secret: ENV["SESSION_SECRET"])
+# ```
+#
+# Under the hood, Tynn::Session uses the [Rack::Session::Cookie][rack-session]
+# middleware. Thus, supports all the options available for this middleware.
+#
+# * `:key` - the name of the cookie. Defaults to `"rack.session"`.
+# * `:expire_after` - sets the lifespan of the cookie. If `nil`,
+# the cookie will be deleted after the user close the browser.
+# Defaults to `nil`.
+# * `:httponly` - if `true`, sets the [HttpOnly][cookie-httponly] attribute.
+# This mitigates the risk of client side scripting accessing the cookie.
+# Defaults to `true`.
+# * `:secure` - if `true`, sets the [Secure][cookie-secure] attribute.
+# This tells the browser to only transmit the cookie over HTTPS. Defaults
+# to `false`.
+#
+# ```
+# Tynn.helpers(
+# Tynn::Session,
+# key: "app",
+# secret: ENV["SESSION_SECRET"],
+# expire_after: 36_000, # seconds
+# httponly: true,
+# secure: true
+# )
+# ```
+#
+# [cookie-httponly]: https://www.owasp.org/index.php/Session_Management_Cheat_Sheet#HttpOnly_Attribute
+# [cookie-secure]: https://www.owasp.org/index.php/Session_Management_Cheat_Sheet#Secure_Attribute
+# [rack-session]: http://www.rubydoc.info/gems/rack/Rack/Session/Cookie
+#
module Tynn::Session
RACK_SESSION = "rack.session".freeze # :nodoc:
def self.setup(app, options = {}) # :nodoc:
- options = options.dup
- options[:http_only] ||= true
-
app.use(Rack::Session::Cookie, options)
end
+ # Returns the session hash.
+ #
+ # ```
+ # session # => {}
+ #
+ # session[:foo] = "foo"
+ # session[:foo] # => "foo"
+ # ```
+ #
def session
return env[RACK_SESSION]
end
end