The Perl Toolchain Summit 2025 Needs You: You can help 🙏 Learn more

#!/usr/bin/env perl
# This demo application shows usage of the Dancer::Plugin::SPID module.
# See config.yml for its configuration.
use Dancer2;
# We don't need to configure any custom route for SPID. See index.tt and user.tt
# for how to include the SPID button and the logout link.
get '/' => sub {
# If we have an active SPID session, display a page with user attributes,
# otherwise show a generic login page containing the SPID button.
if (spid_session) {
template 'user';
} else {
template 'index';
}
};
# That's it. Seriously, that's all you need.
# Below you'll see how to customize the behavior further by configuring one or
# more hooks that the SPID plugin will call.
# This hook is called when the login endpoint is called and the AuthnRequest
# is about to be crafted.
hook 'plugin.SPID.before_login' => sub {
# ...
};
# This hook is called after the SPID session was successfully initiated.
hook 'plugin.SPID.after_login' => sub {
info "User " . spid_session->nameid . " logged in";
# Here you might want to create the user in your local database or do more
# things for initializing the session. Make sure everything you do here is
# idempotent.
# Log assertion as required by the SPID rules.
# Warning: in order to comply with rules, this should be logged in a more
# permanent way than regular Dancer logs, so you'd better use a database
# or a dedicated log file.
info "SPID Assertion: " . spid_session->assertion_xml;
};
# This hook is called after a failed SPID login.
hook 'plugin.SPID.after_failed_login' => sub {
my $statuscode = shift;
info "SPID login failed: $statuscode";
};
# This hook is called when the logout endpoint is called and the LogoutRequest
# is about to be crafted.
hook 'plugin.SPID.before_logout' => sub {
debug "User " . spid_session->nameid . " is about to logout";
};
# This hook is called when a SPID session is terminated (this might be triggered
# also when user initiated logout from another Service Provider or directly
# within the Identity Provider, thus without calling our logout endpoint and
# the 'before_logout' hook).
hook 'plugin.SPID.after_logout' => sub {
my $success = shift; # 'success' or 'partial'
debug "User " . spid_session->nameid . " logged out";
};
dance;
__END__