Ingot.Auth (Ingot v0.1.0)
View SourceAuthentication and session management for Ingot.
Provides functions for creating and validating sessions, checking roles, and managing user authentication state.
Session Management
Sessions are stored in Phoenix encrypted cookies and include:
- User ID
- Roles
- Expiration timestamp
Role Hierarchy
The :admin role grants all permissions. When checking roles,
admin users are considered to have all roles.
Examples
# Create a session
user = %{id: "user_123", email: "test@example.com", roles: [:labeler]}
session_data = Auth.create_session(user)
# Validate a session
case Auth.validate_session(session_data) do
{:ok, session} -> # Session is valid
{:error, :expired} -> # Session has expired
{:error, :invalid_session} -> # Session is malformed
end
# Check roles
Auth.has_role?([:labeler, :admin], :labeler) #=> true
Auth.has_role?([:admin], :auditor) #=> true (admin has all roles)
Summary
Functions
Create session data for a user.
Check if a user has a specific role.
Validate session data.
Types
Functions
@spec create_session( user(), keyword() ) :: session_data()
Create session data for a user.
Options
:ttl_hours- Session time-to-live in hours (default: 24)
Examples
iex> user = %{id: "user_123", email: "test@example.com", roles: [:labeler]}
iex> session = Auth.create_session(user)
iex> session.user_id
"user_123"
Check if a user has a specific role.
The :admin role grants all permissions, so admin users will return true
for any role check.
Examples
iex> Auth.has_role?([:labeler], :labeler)
true
iex> Auth.has_role?([:labeler], :admin)
false
iex> Auth.has_role?([:admin], :labeler)
true
@spec validate_session(map() | nil) :: {:ok, session_data()} | {:error, :expired | :invalid_session}
Validate session data.
Returns {:ok, session_data} if the session is valid and not expired.
Returns {:error, :expired} if the session has expired.
Returns {:error, :invalid_session} if the session is malformed.
Examples
iex> session = %{user_id: "123", user_email: "test@example.com", roles: [:labeler], expires_at: future_timestamp}
iex> Auth.validate_session(session)
{:ok, %{user_id: "123", ...}}
iex> expired_session = %{user_id: "123", expires_at: past_timestamp}
iex> Auth.validate_session(expired_session)
{:error, :expired}