Plugin OJS 3.4 (generic) che sincronizza lo stato di sottoscrizione individuale di OJS con un claim OIDC ricevuto via Single Sign-On da un Identity Provider esterno — tipicamente WordPress con il plugin companion WP OJS SSO Bridge (repo wordpress-ojs-plugin).
Sviluppato da GuIT - Gruppo Utilizzatori Italiani di TeX per la rivista ArsTeXnica ospitata su arstexnica.guitex.org.
subscription_active (configurabile) dall'id_token JWT salvato in sessione dal plugin pkp/openid.id_token quando il plugin upstream lo memorizza cifrato (OpenIDPlugin::encryptOrDecrypt con hashSecret non vuoto).subscriptions con il subscription_type_id configurato e durata in mesi.AboutHandler::subscriptions → /index quando OJS non ha pagamenti integrati attivi.access_token in sessione (necessaria per chiamare UserInfo via Authorization: Bearer): vedi patches/openid-handler/OpenIDHandler.php nel workspace GuIT (cfr. patches/openid-handler/README.txt).wp-ojs-sso-bridge.Importante: senza la patch su
OpenIDHandler.php, la chiamata UserInfo verso WordPress fallisce con 401 (l'id_tokenviene rifiutato come Bearer) e la tabellasubscriptionsresta vuota. Vedi anchepatches/pkp-openid-store-access-token.md.
plugins/generic/:cd /path/to/ojs/plugins/generic unzip /path/to/ojsWpSsoSubscription-X.Y.Z.zip chown -R www-data:www-data ojsWpSsoSubscription
Prima di configurare il plugin serve un Subscription Type attivo per il journal:
setup-ojs-subscriptions.php (incluso nel plugin) nella document root di OJS.https://arstexnica.guitex.org/setup-ojs-subscriptions.php e annotare il Subscription Type ID mostrato.Verifica del tipo via SQL:
SELECT type_id, format, institutional FROM subscription_types WHERE journal_id = 1; -- format atteso per il download PDF: 1 (solo online) oppure 17 (stampa+online) -- format = 16 (solo stampa) blocca i PDF anche per utenti "attivi"
admin OJS → Plugins → OJS WP SSO Subscription → Settings
| Campo | Valore consigliato | Note |
|---|---|---|
| Claim name | subscription_active |
Deve coincidere col plugin WordPress |
| Subscription Type ID | (dal passo precedente) | Tipo da assegnare quando il claim è "attivo" |
| Duration | 12 |
Mesi di validità della sottoscrizione creata |
| Revalidation interval | 300 |
Secondi tra una rivalidazione e l'altra (default 5 min) |
| UserInfo URL | https://guitex.org/wp-json/openid-connect/userinfo |
Endpoint UserInfo dell'IdP WordPress |
pkp/openid (companion)https://guitex.org/.well-known/openid-configurationojs-arstexnica (stesso WP)Accedi con WordPress (opzionale)flowchart LR
User-->|click "Accedi con WordPress"| OJS
OJS-->|Authorize| WP[WordPress IdP]
WP-->|id_token + access_token| OJS
OJS-->|LoadHandler hook| Plugin[ojsWpSsoSubscription]
Plugin-->|decode JWT / UserInfo Bearer| Claim["{ subscription_active: 1 }"]
Claim-->|INSERT/UPDATE| DB[(subscriptions)]
DB-->|IssueAction::subscribedUser| PDFOK[PDF sbloccati]
Hook OJS principali registrati (OjsWpSsoSubscriptionPlugin::register):
| Hook | Scopo |
|---|---|
LoadHandler |
Sincronizza lo stato a ogni richiesta autenticata (lazy, perché pkp/openid non emette un hook "authenticated"). |
IssueGridHandler::fetchGrid |
Filtra i fascicoli a sottoscrizione dall'archivio per i non abbonati. |
IssueAction::subscribedUser |
Riapplica il claim al check core dopo la sincronizzazione. |
TemplateManager::display |
Personalizzazione homepage. |
Request::redirect |
Annulla il redirect about/subscriptions → /index su siti SSO-only. |
Codice rilevante: OjsWpSsoSubscriptionPlugin.php, OjsWpSsoSubscriptionSettingsForm.php.
Nel workspace di deploy GuIT è incluso diagnose-subscription.php: caricarlo temporaneamente nella document root OJS e visitare:
https://arstexnica.guitex.org/diagnose-subscription.php?user=<email> — mostra meta utente, decodifica JWT, righe in subscriptions.https://arstexnica.guitex.org/diagnose-subscription.php?probe_userinfo=1 — testa la raggiungibilità dell'endpoint UserInfo configurato (deve restituire 200, non 404).In testa all'output dello script compare il numero di versione (es. 2026-04-22-v3) per verificare di star usando l'ultima versione. Eliminare lo script appena terminata la diagnosi.
subscriptions resta vuotaOpenIDHandler.php applicata? (verificare in plugins/generic/openid/handler/OpenIDHandler.php la presenza dei blocchi "Guitex" che salvano access_token).probe_userinfo=1 non 404).subscription_active presente nel JWT decodificato dello script diagnose?claimName identico tra plugin WP e plugin OJS?Subscription Type ID esistente nel journal?format del tipo sottoscrizione 1 o 17, non 16.arstexnica.guitex.org con quell'utente via SSO./diagnose-subscription.php?user=<email> → deve mostrare almeno una riga in subscriptions con type_id = Subscription Type ID configurato.subscriptions deve risultare expired / rimossa, e il PDF deve tornare bloccato.git clone https://niphredil.duckdns.org/git/fabio/ojs-wordpress-plugin.git cd ojs-wordpress-plugin # branch principale: main
PR e issue su GitBucket.
cd /Users/fabio.arrigoni/Downloads/Guitex
zip -r releases/ojsWpSsoSubscription-X.Y.Z.zip ojsWpSsoSubscription \
-x 'ojsWpSsoSubscription/.git/*' \
'ojsWpSsoSubscription/**/.DS_Store' \
'ojsWpSsoSubscription/**/*.bak*'
La versione dichiarata in version.xml deve essere aggiornata in sync col tag Git (es. tag v1.1.0 ↔ <release>1.1.0.0</release>).
GPL v3. Vedere intestazioni dei file sorgente e https://www.gnu.org/licenses/gpl-3.0.html.
subscriptions, decifratura id_token cifrato, fallback UserInfo Bearer, filtro archivio, fix redirect about/subscriptions.Le versioni successive saranno tracciate in version.xml e nelle Release di GitBucket.