Page History

Home

Fabio edited this page on 19 May

Clone this wiki locally

OJS WP SSO Subscription

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.


Funzionalità

  • Legge il claim subscription_active (configurabile) dall'id_token JWT salvato in sessione dal plugin pkp/openid.
  • Decifra l'id_token quando il plugin upstream lo memorizza cifrato (OpenIDPlugin::encryptOrDecrypt con hashSecret non vuoto).
  • Fallback su endpoint UserInfo OIDC quando il claim non è presente nel JWT.
  • Crea/aggiorna automaticamente una riga in subscriptions con il subscription_type_id configurato e durata in mesi.
  • Rivaluta periodicamente lo stato (default 5 minuti) per propagare la disattivazione lato WordPress.
  • Nasconde dall'archivio i fascicoli a sottoscrizione per gli utenti non abbonati.
  • Annulla il redirect indesiderato di AboutHandler::subscriptions/index quando OJS non ha pagamenti integrati attivi.
  • Localizzazione italiana completa.

Dipendenze

  • OJS 3.4 (testato su 3.4.0-7)
  • PHP ≥ 8.1
  • Plugin upstream pkp/openid con la patch GuIT che salva 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).
  • Identity provider OIDC che emette il claim configurato — tipicamente WordPress con wp-ojs-sso-bridge.

Importante: senza la patch su OpenIDHandler.php, la chiamata UserInfo verso WordPress fallisce con 401 (l'id_token viene rifiutato come Bearer) e la tabella subscriptions resta vuota. Vedi anche patches/pkp-openid-store-access-token.md.


Installazione

Da release ZIP

  1. Scaricare l'ultima release ZIP dalla pagina Releases.
  2. Estrarre dentro plugins/generic/:
    cd /path/to/ojs/plugins/generic
    unzip /path/to/ojsWpSsoSubscription-X.Y.Z.zip
    chown -R www-data:www-data ojsWpSsoSubscription
  3. admin OJS → Settings → Website → Plugins → Generic → spuntare OJS WP SSO Subscription.
  4. Cliccare Settings del plugin e completare la configurazione (vedi sotto).

Setup tipi di sottoscrizione (una tantum)

Prima di configurare il plugin serve un Subscription Type attivo per il journal:

  1. Copiare setup-ojs-subscriptions.php (incluso nel plugin) nella document root di OJS.
  2. Visitare https://arstexnica.guitex.org/setup-ojs-subscriptions.php e annotare il Subscription Type ID mostrato.
  3. Eliminare immediatamente lo script dal server.

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"

Configurazione

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

Configurazione plugin pkp/openid (companion)

  • Custom provider: on
  • Config URL: https://guitex.org/.well-known/openid-configuration
  • Client ID: ojs-arstexnica (stesso WP)
  • Client Secret: lo stesso del plugin WP
  • Button text: Accedi con WordPress (opzionale)

Architettura

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.


Diagnostica

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.

Checklist se la tabella subscriptions resta vuota

  1. Patch OpenIDHandler.php applicata? (verificare in plugins/generic/openid/handler/OpenIDHandler.php la presenza dei blocchi "Guitex" che salvano access_token).
  2. UserInfo URL configurata correttamente? (probe_userinfo=1 non 404).
  3. Claim subscription_active presente nel JWT decodificato dello script diagnose?
  4. claimName identico tra plugin WP e plugin OJS?
  5. Subscription Type ID esistente nel journal?
  6. format del tipo sottoscrizione 1 o 17, non 16.

Test end-to-end

  1. WP admin → attivare il checkbox "Sottoscrizione OJS attiva" su un utente di test.
  2. Login da arstexnica.guitex.org con quell'utente via SSO.
  3. Visitare /diagnose-subscription.php?user=<email> → deve mostrare almeno una riga in subscriptions con type_id = Subscription Type ID configurato.
  4. Verificare il download PDF di un fascicolo a sottoscrizione.
  5. Disattivare il checkbox lato WP → al successivo accesso OJS la riga in subscriptions deve risultare expired / rimossa, e il PDF deve tornare bloccato.

Sviluppo

git clone https://niphredil.duckdns.org/git/fabio/ojs-wordpress-plugin.git
cd ojs-wordpress-plugin
# branch principale: main

PR e issue su GitBucket.

Build di una release

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>).


Licenza

GPL v3. Vedere intestazioni dei file sorgente e https://www.gnu.org/licenses/gpl-3.0.html.


Storia delle versioni

  • 1.0.0 — Release iniziale: sync claim → 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.