Entra ID
Northwestern Single Sign-On
Primary authentication method for Northwestern users via NetID.
- Integrated with Northwestern’s identity provider
- Multi-factor authentication support
- Automatic user provisioning
- Session-based authentication
The Northwestern Laravel Starter provides a flexible, multi-method authentication system designed to handle both Northwestern users (via NetID/SSO) and external collaborators (via passwordless verification codes or Access Tokens).
Entra ID
Northwestern Single Sign-On
Primary authentication method for Northwestern users via NetID.
Passwordless Verification Codes
Email OTP Authentication
Email-based passwordless authentication for external users.
Access Tokens
Bearer Token Authentication
Long-lived tokens for programmatic API access.
Northwestern users authenticate via single sign-on using their NetID credentials.
User visits protected route
User attempts to access a route requiring authentication
Redirect to SSO
Application redirects to Northwestern’s authentication service
User authenticates
User enters NetID and password (+ MFA if enabled)
Callback with token
SSO provider redirects back with authentication token
User provisioning
Application creates/updates user record from Directory Search data
Session established
User is logged in and session cookie is set
When a Northwestern user logs in for the first time, the application:
Subsequent logins update the user’s demographic data to keep it synchronized.
External users (non-Northwestern) can access the application via time-limited verification codes sent to their email.
Admin creates local user
Administrator creates a local user account in the Filament panel
Verification code sent
Admin triggers a code email or user requests one themselves
User receives email
Email contains a time-limited verification code (valid for 10 minutes by default)
User enters code
Code authenticates the user and establishes a session
Code expires
Code becomes invalid after use or expiration
# Enable/disable local authenticationLOCAL_AUTH_ENABLED=true
# Rate limit for login code requests (per hour)LOCAL_AUTH_RATE_LIMIT_PER_HOUR=10
# Where to redirect after successful loginLOCAL_AUTH_REDIRECT_AFTER_LOGIN=/use App\Domains\User\Models\User;use App\Domains\User\Enums\AffiliationEnum;use App\Domains\User\Enums\AuthTypeEnum;use App\Domains\User\Actions\Local\IssueLoginChallenge;
$user = User::create([ 'username' => 'jdoe', 'auth_type' => AuthTypeEnum::LOCAL, 'primary_affiliation' => AffiliationEnum::AFFILIATE, 'email' => 'jane.doe@example.com', 'first_name' => 'Jane', 'last_name' => 'Doe',]);
// Send verification coderesolve(IssueLoginChallenge::class)($user->email, request()->ip(), request()->userAgent());Time-Limited Codes
Codes automatically expire after configured duration (default: 10 minutes)
Single-Use Codes
Each code can only be used once, preventing replay attacks
Rate Limiting
Limits login code requests to prevent abuse and enumeration attacks
Timing Attack Protection
Consistent response times prevent user enumeration via timing analysis
API users authenticate using long-lived Bearer tokens for programmatic access.
Admin creates API user
Administrator creates an API user and generates first token
Token delivered once
Plain-text token shown only at creation (never retrievable again)
Client stores token
Client securely stores token for API requests
Token in requests
Client includes token in Authorization: Bearer header
Middleware validates
AuthenticatesAccessTokens middleware validates token and IP allowlist
Request logged
API request logged with metrics and analytics
See the API Documentation for complete Access Token management details.
After authentication, authorization is handled through Laravel’s permission system combined with custom policies.
The starter uses a role-based permission system:
Permissions - Granular actions users can perform (view users, edit roles, etc.)
Roles - Collections of permissions assigned to users
Role Types - Categories of roles (Staff, API Integration, etc.)
Policies - Laravel policies check permissions for specific actions
Users listed in SUPER_ADMIN_NETIDS bypass all authorization checks:
SUPER_ADMIN_NETIDS=abc123,xyz789,def456These users:
StakeholderSeeder