Verified: WordPress 6 +
openid-connect-generic 3.11.3; Telegram channel. Working: sign-in,
automatic user creation, id_token signature checked against JWKS. WordPress with Email,
WhatsApp or the other channels has not been tested.What you need
- a running Veriqa server reachable from the site (in production: a public HTTPS address with a valid certificate);
- a client registered in Veriqa:
client_id,client_secret, and aredirect_uriof the formhttps://your-site/wp-admin/admin-ajax.php?action=openid-connect-authorize; - administrator access in WordPress.
1. The plugin
Installopenid-connect-generic (10k+ installs, actively maintained). The alternatives do not
fit: nicko170/wp-openid has not shipped since 2023, the Scouting plugin is pinned to someone
else’s issuer, and miniOrange keeps the settings you need behind its paid edition.
2. Plugin settings
Take the addresses from your server’s discovery document (https://veriqa.example.com/.well-known/openid-configuration):
Four settings deserve to be named explicitly — they decide what the account looks like:
- Leave
identity_keyalone. With the default, the username is human-readable (alice); setting it tosubby hand produces a username liketelegram123456789. nickname_key→preferred_username,displayname_format→name.- Turn
enable_loggingon, at least while you set things up: the plugin log shows why a sign-in fails. - Leave
no_sslverifyoff. TLS verification should work; if it gets in the way, the problem is the certificate, not the check.
3. Drop scope from the code exchange
This step is mandatory, and it is worth understanding rather than just applying.
The plugin puts scope into the grant_type=authorization_code request, where
RFC 6749 §4.1.3 does not provide for it:
the granted scope comes from the authorization code itself. Keycloak, Auth0 and Azure silently
ignore the extra parameter — a strict OpenIddict server rejects the request (OpenIddict issue
#1729 is closed as invalid).
Removing the parameter makes the request conform to the standard. It is not a way around a
check and not a weakening of your security: what gets removed is something that should not be
in the request at all.
The site owner fixes it
A six-line mu-plugin on the WordPress side. The Veriqa server is untouched — the right choice
when Veriqa is not yours (the cloud, or someone else’s deployment).
The Veriqa owner fixes it
The
drop-scope-on-code-exchange compatibility quirk — a relaxation scoped to a single
ClientId on the server side. The right choice when there are many sites and touching each
one is not practical.Option A — the mu-plugin
Drop the file intowp-content/mu-plugins/ (create the directory if it is missing). Must-use
plugins load automatically — there is nothing to activate in the admin area.
wp-content/mu-plugins/veriqa-oidc-compat.php
scope is dropped only for the get-authentication-token operation. It
stays on token refresh, where RFC 6749 §6 does allow narrowing the scope.
Option B — the quirk on the Veriqa side
The same parameter, removed by the server, for one client. Enabling it takes two steps, and Veriqa logs a warning about every enabled quirk at startup:appsettings.json
wordpress-openid-connect-generic profile are in
Client compatibility.
With neither option in place the sign-in fails at the code exchange, and WordPress sends the
browser back to wp-login.php?login-error=invalid_request&message=….
What you get
The plugin log showslogin-success Successful login for: telegram123456789; the click-to-
signed-in time is around twenty seconds, including everything the person does on their phone.
The user is created automatically.
The account is created with an empty email — Telegram does not hand out addresses and never
will. If your site requires one, there are two paths: use the Email channel (the address then
arrives in the claims), or have WordPress ask for it after the first sign-in.
Limitations
- Verified with the Telegram channel. On the Email channel the profile looks different:
namerepeats the address instead of carrying a human-readable name, so a recipe tuned on Telegram produces a different-looking account. - A dedicated “Veriqa for WordPress” plugin is not needed: the stock plugin covers the job end to end.
- The avatar is not part of this recipe:
pictureis adata:image URI issued only for theavatarscope and only through userinfo, and the plugin setup above does not request that scope.