diff --git a/C4/Auth.pm b/C4/Auth.pm index f281def2ce..8c8784317e 100644 --- a/C4/Auth.pm +++ b/C4/Auth.pm @@ -1433,6 +1433,13 @@ sub checkauth { } } + if (C4::Context->preference('AzureADOpenIDConnect')) { + if ($query->param("OpenIDConnectFailed")) { + my $reason = $query->param('OpenIDConnectFailed'); + $template->param(invalidAzureADOpenIDConnectLogin => $reason); + } + } + $template->param( LibraryName => C4::Context->preference("LibraryName"), ); diff --git a/Koha.pm b/Koha.pm index a2653023f5..59a5ba5db5 100644 --- a/Koha.pm +++ b/Koha.pm @@ -29,7 +29,7 @@ use vars qw{ $VERSION }; # - #4 : the developer version. The 4th number is the database subversion. # used by developers when the database changes. updatedatabase take care of the changes itself # and is automatically called by Auth.pm when needed. -$VERSION = "20.12.00.050"; +$VERSION = "20.12.00.051"; sub version { return $VERSION; diff --git a/installer/data/mysql/mandatory/sysprefs.sql b/installer/data/mysql/mandatory/sysprefs.sql index 0a86168ee0..90cd59b9f9 100644 --- a/installer/data/mysql/mandatory/sysprefs.sql +++ b/installer/data/mysql/mandatory/sysprefs.sql @@ -86,6 +86,14 @@ INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` ('AutoSelfCheckID','','','Staff ID with circulation rights to be used for automatic web-based self-check. Only applies if AutoSelfCheckAllowed syspref is turned on.','free'), ('AutoSelfCheckPass','','','Password to be used for automatic web-based self-check. Only applies if AutoSelfCheckAllowed syspref is turned on.','free'), ('AutoSwitchPatron', '0', '', 'Auto switch to patron', 'YesNo'), +('AzureADOpenIDConnect', '0', NULL, 'if ON, allows the use of AzureAD OpenID Connect for login', 'YesNo'), +('AzureADOpenIDConnectAutoRegister', '0', NULL, 'If ON autoprovisions new users coming from AzureAD', 'YesNo'), +('AzureADOAuth2TenantID', '', NULL, 'Tenant ID for the web app registered with AzureAD', 'Free'), +('AzureADOAuth2ClientID', '', NULL, 'Client ID for the web app registered with AzureAD', 'Free'), +('AzureADOAuth2ClientSecret', '', NULL, 'Client Secret for the web app registered with AzureAD', 'Free'), +('AzureADOpenIDConnectAutoRegister', '0', NULL, 'if ON autoprovisions users arriving from AzureAD', 'YesNo'), +('AzureADOpenIDConnectDefaultCategory', '', '', 'This category code will be used to create Google OpenID Connect patrons.', 'Textarea'), +('AzureADOpenIDConnectDefaultBranch', '', '', 'This branch code will be used to create Google OpenID Connect patrons.', 'Textarea'), ('Babeltheque','0','','Turn ON Babeltheque content - See babeltheque.com to subscribe to this service','YesNo'), ('Babeltheque_url_js','','','Url for Babeltheque javascript (e.g. http://www.babeltheque.com/bw_XX.js)','Free'), ('Babeltheque_url_update','','','Url for Babeltheque update (E.G. http://www.babeltheque.com/.../file.csv.bz2)','Free'), diff --git a/installer/data/mysql/updatedatabase.pl b/installer/data/mysql/updatedatabase.pl index 6b0a6b53fe..b783345b77 100755 --- a/installer/data/mysql/updatedatabase.pl +++ b/installer/data/mysql/updatedatabase.pl @@ -24274,6 +24274,23 @@ if ( CheckVersion($DBversion) ) { NewVersion( $DBversion, 28108, "Add new systempreference OpacHiddenItemsHidesRecord" ); } +$DBversion = '20.12.00.051'; +if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) { + $dbh->do(q{ + INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES + ('AzureADOpenIDConnect', '0', NULL, 'if ON, allows the use of AzureAD OpenID Connect for login', 'YesNo'), + ('AzureADOAuth2TenantID', '', NULL, 'Tenant ID for the web app registered with AzureAD', 'Free'), + ('AzureADOAuth2ClientID', '', NULL, 'Client ID for the web app registered with AzureAD', 'Free'), + ('AzureADOpenIDConnectDefaultCategory', '', '', 'This category code will be used to create Google OpenID Connect patrons.', 'Textarea'), + ('AzureADOpenIDConnectDefaultBranch', '', '', 'This branch code will be used to create Google OpenID Connect patrons.', 'Textarea'), + ('AzureADOpenIDConnectAutoRegister', '0', NULL, 'if ON autoprovisions users arriving from AzureAD', 'YesNo'), + ('AzureADOAuth2ClientSecret', '', NULL, 'Client Secret for the web app registered with AzureAD', 'Free'); + }); + + print "Upgrade to $DBversion done (Bug 28420 - Allow login via AzureAD OAuth2 (OpenID-Connect))\n"; + SetVersion($DBversion); +} + # SEE bug 13068 # if there is anything in the atomicupdate, read and execute it. my $update_dir = C4::Context->config('intranetdir') . '/installer/data/mysql/atomicupdate/'; diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/admin.pref b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/admin.pref index a858b1d0da..f11fb2af70 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/admin.pref +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/admin.pref @@ -196,6 +196,39 @@ Administration: - "Use this branch code when automatically registering a Google Open ID patron: " - pref: GoogleOpenIDConnectDefaultBranch - "." + AzureAD OpenID Connect: + - + - "Use AzureAD OpenID-Connect login: " + - pref: AzureADOpenIDConnect + choices: + 1: "Yes" + 0: "No" + - You will need to create a new app in https://portal.azure.com and a new secret for this integration + - + - "" + - pref: AzureADOpenIDConnectAutoRegister + choices: + 1: "Allow" + 0: "Don't allow" + - Patrons logging in with AzureAD OpenID to automatically register + - + - "AzureAD Tenant ID: " + - pref: AzureADOAuth2TenantID + - + - "AzureAD Client ID: " + - pref: AzureADOAuth2ClientID + - + - "AzureAD Client Secret: " + - pref: AzureADOAuth2ClientSecret + - + - "Use this category code when automatically registering a AzureAD OpenID patron: " + - pref: AzureADOpenIDConnectDefaultCategory + choices: patron-categories + - "." + - + - "Use this branch code when automatically registering a AzureAD OpenID patron: " + - pref: AzureADOpenIDConnectDefaultBranch + - "." Share anonymous usage statistics: - - "Share anonymous Koha usage data with the Koha community: " diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/includes/masthead.inc b/koha-tmpl/opac-tmpl/bootstrap/en/includes/masthead.inc index b58703b8d0..27d90f1a20 100644 --- a/koha-tmpl/opac-tmpl/bootstrap/en/includes/masthead.inc +++ b/koha-tmpl/opac-tmpl/bootstrap/en/includes/masthead.inc @@ -99,6 +99,8 @@ Log in to your account [% ELSIF ( Koha.Preference('GoogleOpenIDConnect') == 1 ) %] Log in to your account + [% ELSIF ( Koha.Preference('AzureADOpenIDConnect') == 1 ) %] + Log in to your account [% ELSE %] Log in to your account [% END %] diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-auth.tt b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-auth.tt index f15beea5fc..dc9dd4f709 100644 --- a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-auth.tt +++ b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-auth.tt @@ -165,6 +165,18 @@ Log in with Google
If you do not have a Google account, but do have a local account, you can still log in:
[% END # /IF GoogleOpenIDConnect %] + + [% IF ( Koha.Preference('AzureADOpenIDConnect') == 1 ) %] + [% IF ( invalidAzureADOpenIDConnectLogin ) %] +Sorry, your AzureAD login failed. [% invalidAzureADOpenIDConnectLogin | html %]
+Please note that the AzureAD login will only work if you are using the e-mail address registered with this library.
+If you want to, you can try to log in using a different account + [% END %] + Log in with AzureAD +
If you do not have a Microsoft account, but do have a local account, you can still log in:
+ [% END # /IF AzureADOpenIDConnect %] + [% END # /UNLESS OPACShibOnly %] [% IF !Koha.Preference('OPACShibOnly') or SCO_login or SCI_login %] diff --git a/opac/svc/auth/azureadopenidconnect b/opac/svc/auth/azureadopenidconnect new file mode 100755 index 0000000000..1c89819836 --- /dev/null +++ b/opac/svc/auth/azureadopenidconnect @@ -0,0 +1,272 @@ +#!/usr/bin/perl +# Copyright mark.jaroski@gmail.com, jaroskim@who.int 2021 +# based on the google Oauth code from vanoudt@gmail.com 2014 +# +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# Koha is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Koha; if not, see