Sign in with NobleID on Open Journal Systems (OJS)
Add Sign in with NobleID to an OJS journal, through Keycloak today, or directly once PKP releases the updated plugin.
- Written for
- OJS 3.3, 3.4 and 3.5 with PKP's OpenID Authentication Plugin (
openid), releases 3.4.1.0, 4.1.0.0 and 5.1.0.0. The same plugin serves OMP and OPS. - Tested
- Written from the platform's documentation and source code. Not yet run against NobleID.
Register on NobleID
- In Dashboard β OAuth apps, register a confidential app. You need two-step login on your NobleID to do this.
- Add this redirect URI, with your own host:This is Keycloak's redirect URI (route 1). For route 2, register the URL the OJS plugin shows instead.
https://sso.example.org/realms/<realm>/broker/nobleid/endpoint - Tick these scopes: OpenID (always on), Profile
profile, Emailemail. The platform asks for these, and sign-in stops if it asks for a scope the app does not have. - Copy the client ID and the client secret. The secret is shown once.
The app works at once. Until NobleID verifies it, people see a βnot verifiedβ notice on the consent screen.
The released plugin cannot check NobleID's sign-in tokens
The plugin accepts a custom provider by discovery URL. But every released version reads only RSA keys and checks ID tokens as RS256. NobleID signs ID tokens with ES256 only, so the plugin finds no usable key and every sign-in fails with its certificate error. The released plugin also sends no state, nonce or PKCE.
Use one of two routes:
- Through Keycloak. This works today. See route 1 below.
- Directly, once a PKP release includes the plugin's newer code. See route 2.
Route 1: Keycloak between OJS and NobleID
Keycloak checks NobleID's ES256 tokens and issues its own RS256 tokens to OJS, which the plugin accepts.
- Set up NobleID as an identity provider in Keycloak by following the Keycloak guide. Use the alias
nobleid. - In the same realm, create a client for OJS: Clients β Create client, type
OpenID Connect, client IDojs. Turn Client authentication and Standard flow on, everything else off. Under Valid redirect URIs, enter the redirect URL the OJS plugin settings page shows (step 4). Under Valid post logout redirect URIs, enter the journal's home page, for examplehttps://journal.example.org/index.php/<journal>/index: the plugin sends people there through Keycloak when they sign out. Copy the client secret from the Credentials tab. - Send people straight to NobleID instead of Keycloak's login form: Authentication β browser β Identity Provider Redirector β Default Identity Provider =
nobleid. If the realm serves other applications, duplicate the browser flow, set the redirector in the copy, and select the copy under the OJS client's Advanced β Authentication flow overrides β Browser Flow. - In OJS, open Settings β Website β Plugins β Installed Plugins β Generic Plugins β OpenID Authentication Plugin β Settings. Tick Custom OpenID Provider and fill in the fields below. Copy the redirect URL shown next to the custom provider into the Keycloak client (step 2).
- Keep Enable legacy login (OJS passwords) ticked until at least one administrator account is linked and tested.
| Field, as OJS labels it | Value |
|---|---|
| Please enter the configuration URL of your OpenID provider | https://sso.example.org/realms/<realm>/.well-known/openid-configuration |
| Please enter your clientId. | the Keycloak client ID from step 2 |
| Please enter your client secret. | the Keycloak client secret from step 2 |
| Custom login button settings: Please enter the label of the login button. | Sign in with NobleID |
The redirect URL usually looks like https://journal.example.org/index.php/<journal>/openid/doAuthentication?provider=custom, with the journal's path. If the plugin is enabled for the whole site, the path is index instead.
OJS receives given_name, family_name and email as Keycloak passes them on. OJS links its accounts to Keycloak's sub, and Keycloak links that to NobleID's sub. Neither link changes if the person changes their email.
Signing out ends the Keycloak session. Whether it also ends the NobleID session depends on Keycloak's Logout URL; see the Keycloak guide.
Route 2: connect directly (not yet released)
The plugin's main branch reads EC keys, checks iss, aud and nonce, and sends state, nonce and PKCE S256. On 2 November 2026 that code was in no release and on no stable branch, and we have not run it against NobleID. When a release contains it, register the redirect URL the settings page shows and fill in:
| Field, as OJS labels it | Value |
|---|---|
| Custom OpenID Provider | ticked |
| Please enter the configuration URL of your OpenID provider | https://id.nobleid.org/.well-known/openid-configuration |
| Please enter your clientId. | nbcl_your_client_id |
| Please enter your client secret. | nbcs_your_client_secret |
| Custom login button settings: Please enter the label of the login button. | Sign in with NobleID |
- The redirect URL usually looks like
https://journal.example.org/index.php/<journal>/openid/doAuthentication?provider=custom. The?provider=custompart belongs to it. Register it too. - The plugin reads the endpoints from discovery, including the authorization endpoint on
www.nobleid.organd the end-session endpoint. - It asks for
openid profile emailand sends the client secret in the request body (client_secret_post), which NobleID accepts. - On sign-out it sends the person to NobleID, which asks them to confirm and returns them to the journal's home page. Add that page (for example
https://journal.example.org/index.php/<journal>/index) to the app's sign-out return URLs in the NobleID dashboard.
Fill the profile from NobleID
| NobleID claim | OJS field | Scope |
|---|---|---|
given_name | Given name | profile |
family_name | Family name | profile |
email | email |
Route 1 passes these three on when OJS creates the account. The person fills the rest of their OJS profile.
For an ORCID iD in OJS, use PKP's ORCID plugin. It checks the iD with ORCID itself.
Every claim, and how to fill a profile without overwriting what people edit: Fill your app's profile from NobleID.
Before you go live
- Sign in once with your own NobleID. People need a first and last name on their NobleID profile to sign in; NobleID asks for it if it is missing.
- Key accounts on
sub. Link to an existing account by email only whenemail_verifiedis true. - Remove any localhost redirect URIs from the app.
- Keep the client secret out of version control.
NobleID values
| Issuer | https://id.nobleid.org |
| Discovery URL | https://id.nobleid.org/.well-known/openid-configuration |
| Authorization endpoint | https://www.nobleid.org/oauth/authorize |
| Token endpoint | https://id.nobleid.org/oauth/token |
| Userinfo endpoint | https://id.nobleid.org/oauth/userinfo |
| JWKS URL | https://id.nobleid.org/.well-known/jwks.json |
| Revocation endpoint | https://id.nobleid.org/oauth/revoke |
| End-session endpoint | https://www.nobleid.org/oauth/logout |
| ID token signing | ES256 |
Sources
- PKP OpenID plugin (see handler/OpenIDHandler.php)
- PKP documentation
- Keycloak: default identity provider
Something here does not match what you see? Email info@nobleid.org.