{"id":205354,"date":"2025-02-12T20:02:27","date_gmt":"2025-02-12T20:02:27","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/wpoauth\/"},"modified":"2026-08-19T17:21:10","modified_gmt":"2026-08-19T17:21:10","slug":"wpoauth","status":"closed","type":"plugin","link":"https:\/\/fr-ca.wordpress.org\/plugins\/wpoauth\/","author":23106777,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.1.0","stable_tag":"1.1.0","tested":"7.0.4","requires":"5.0","requires_php":"7.4","requires_plugins":null,"header_name":"Secufor OAuth","header_author":"Secufor","header_description":"A basic plugin to demonstrate WordPress extension.","assets_banners_color":"","last_updated":"2026-08-19 17:21:10","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/secufor.net","rating":5,"author_block_rating":0,"active_installs":0,"downloads":2311,"num_ratings":2,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.1":{"tag":"1.0.1","author":"secufor","date":"2025-04-16 18:14:27"},"1.0.2":{"tag":"1.0.2","author":"secufor","date":"2025-04-16 18:14:27"},"1.0.3":{"tag":"1.0.3","author":"secufor","date":"2026-01-28 19:36:42"},"1.0.4":{"tag":"1.0.4","author":"secufor","date":"2026-01-28 19:36:42"},"1.0.5":{"tag":"1.0.5","author":"secufor","date":"2026-01-28 19:36:42"},"1.0.6":{"tag":"1.0.6","author":"secufor","date":"2026-01-28 19:36:42"},"1.0.7":{"tag":"1.0.7","author":"secufor","date":"2026-02-23 15:11:44"},"1.0.8":{"tag":"1.0.8","author":"secufor","date":"2026-03-24 09:18:07"},"1.1.0":{"tag":"1.1.0","author":"secufor","date":"2026-08-19 17:21:10"}},"upgrade_notice":{"1.1.0":"<p>Security release. Fixes an unauthenticated endpoint that could disconnect your Secufor account (CVE-2026-7617), hardens the OAuth flow against login CSRF and account takeover, and repairs the sign-in flow, which did not complete in earlier versions. Upgrading is strongly recommended.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":2},"assets_icons":{"icon-256x256.png":{"filename":"icon-256x256.png","revision":3253295,"resolution":"256x256","location":"assets","locale":"","width":512,"height":512}},"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.1","1.0.2","1.0.3","1.0.4","1.0.5","1.0.6","1.0.7","1.0.8","1.1.0"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[710,2061,43290,5136,2469],"plugin_category":[38],"plugin_contributors":[238256],"plugin_business_model":[],"class_list":["post-205354","plugin","type-plugin","status-closed","hentry","plugin_tags-authentication","plugin_tags-oauth","plugin_tags-openid-connect","plugin_tags-single-sign-on","plugin_tags-sso","plugin_category-authentication","plugin_contributors-secufor","plugin_committers-secufor"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/wpoauth.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Secufor OAuth adds Single Sign-On (SSO) to WordPress. Visitors sign in with an account they already have \u2014 Google, Microsoft, GitHub, Slack and others \u2014 instead of creating yet another password on your site.<\/p>\n\n<p>The plugin implements the OAuth 2.0 Authorization Code flow: the visitor is sent to the provider, the provider sends them back with a one-time code, and the plugin exchanges that code for the user's profile server-side. A matching WordPress account is created on first sign-in, or reused on subsequent ones.<\/p>\n\n<h4>Features<\/h4>\n\n<ul>\n<li>Authorization Code flow with a single-use, cookie-bound <code>state<\/code> parameter (CSRF protection)<\/li>\n<li>Optional PKCE (S256) for providers that require or recommend it<\/li>\n<li>Configurable mapping between the provider's claims and WordPress user fields<\/li>\n<li>One shortcode per configured provider, so you can place the sign-in button anywhere<\/li>\n<li>Accounts are matched on the provider's stable user identifier, not on e-mail alone<\/li>\n<li>Provider logos are bundled with the plugin \u2014 no third-party CDN is contacted<\/li>\n<\/ul>\n\n<h4>Included provider presets<\/h4>\n\n<p>Google, Microsoft, Microsoft Entra ID, Facebook, Keycloak, Discord, GitHub, GitLab, LinkedIn, WordPress.com, Slack, Amazon, Twitch, Salesforce, AWS Cognito, Dropbox, Zoom, Spotify and Bitbucket.<\/p>\n\n<p>A generic OpenID Connect preset is also included, so any standards-compliant provider can be configured by entering its authorization, token and userinfo endpoints manually.<\/p>\n\n<p>Presets only pre-fill the endpoints and scopes. You still need to register an application with the provider and paste in your own Client ID and Client Secret.<\/p>\n\n<h4>Providers that are not supported<\/h4>\n\n<p>For transparency, these cannot work with the plugin's server-side Authorization Code flow and are deliberately not offered:<\/p>\n\n<ul>\n<li><strong>Sign in with Apple<\/strong> \u2014 requires a signed JWT as the client secret and returns the identity in an <code>id_token<\/code> rather than from a userinfo endpoint.<\/li>\n<li><strong>X (Twitter)<\/strong> \u2014 the authorization code expires after 30 seconds, which is unreliable for a page round-trip.<\/li>\n<li><strong>Instagram<\/strong> \u2014 professional accounts only, and never returns an e-mail address.<\/li>\n<li><strong>Reddit<\/strong> \u2014 never returns an e-mail address, which the plugin needs to create the WordPress account.<\/li>\n<li><strong>Stripe<\/strong> \u2014 Stripe Connect is a payments authorization flow, not an identity provider.<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to <strong>Secufor<\/strong> (https:\/\/secufor.net) to sign the site administrator in to their Secufor account.<\/p>\n\n<ul>\n<li><strong>When:<\/strong> only from the plugin's admin screens, when an administrator submits the Secufor login form, and when the plugin's main screen is opened.<\/li>\n<li><strong>What is sent:<\/strong> the Secufor username and password entered by the administrator, the resulting authentication token, and the plugin identifier (<code>secuforoauth<\/code>). No site visitor data and no WordPress user data are sent.<\/li>\n<li>Terms of service: https:\/\/secufor.net\/cgu<\/li>\n<\/ul>\n\n<p>The plugin also connects to whichever OAuth provider <strong>you<\/strong> configure (Google, Microsoft, GitHub, and so on). These connections happen when a visitor clicks a sign-in button: the plugin sends your Client ID and Client Secret together with the authorization code to that provider's token endpoint, and then requests the signing-in user's profile. Which provider is contacted, and therefore whose terms apply, depends entirely on your configuration. No data is sent to any provider you have not configured.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code>, or install it from the Plugins screen.<\/li>\n<li>Activate the plugin.<\/li>\n<li>Go to <strong>Secufor Oauth \u2192 Create OAuth<\/strong> and pick a provider.<\/li>\n<li>Register an application with that provider and set its redirect URI to a URL on your site.<\/li>\n<li>Paste your Client ID and Client Secret into the plugin, and save.<\/li>\n<li>Copy the shortcode shown on the provider's configuration screen and place it on any page or post.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"what%20should%20i%20use%20as%20the%20redirect%20uri%3F\"><h3>What should I use as the redirect URI?<\/h3><\/dt>\n<dd><p>Any URL on your site works, for example your home page. Enter exactly the same value in the plugin and in the provider's application settings \u2014 most providers reject the exchange if the two differ by even a trailing slash.<\/p><\/dd>\n<dt id=\"why%20can%27t%20my%20administrator%20account%20sign%20in%20through%20a%20provider%3F\"><h3>Why can't my administrator account sign in through a provider?<\/h3><\/dt>\n<dd><p>By default the plugin refuses to link an existing account that holds administrative privileges to an external provider based on its e-mail address alone, because a misconfigured or hostile provider could otherwise claim your administrator's address. Developers can allow it with the <code>secuforoauth_allow_privileged_email_linking<\/code> filter.<\/p><\/dd>\n<dt id=\"can%20i%20change%20which%20provider%20field%20maps%20to%20which%20wordpress%20field%3F\"><h3>Can I change which provider field maps to which WordPress field?<\/h3><\/dt>\n<dd><p>Yes. Each provider has a \"Configure Mappages\" section: the key is the claim returned by the provider, the value is the target WordPress field. Editing the mapping is available in the premium version.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20work%20with%20a%20page%20cache%3F\"><h3>Does the plugin work with a page cache?<\/h3><\/dt>\n<dd><p>Yes. The sign-in button links to a static URL; the security token is generated when the visitor clicks it, not when the page is rendered.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.1.0<\/h4>\n\n<ul>\n<li><strong>Security:<\/strong> the <code>secuforoauth_unregister_action<\/code> AJAX endpoint was reachable by unauthenticated visitors and could disconnect the site from its Secufor account. It now requires the <code>manage_options<\/code> capability and a valid nonce, and is no longer registered for logged-out users (CVE-2026-7617).<\/li>\n<li><strong>Security:<\/strong> the OAuth <code>state<\/code> parameter is now generated per click, stored single-use, and bound to the visitor's browser with a cookie, preventing login CSRF.<\/li>\n<li><strong>Security:<\/strong> accounts are matched on the provider's stable user identifier; e-mail matching now requires a verified address and never links an account with administrative privileges automatically.<\/li>\n<li><strong>Security:<\/strong> a provider can no longer set a WordPress role or capability through the attribute mapping.<\/li>\n<li><strong>Security:<\/strong> the sign-in button markup is regenerated from validated colour and size values instead of being stored as free-form HTML.<\/li>\n<li><strong>Security:<\/strong> the client secret is no longer rendered back into the configuration form.<\/li>\n<li><strong>Fixed:<\/strong> sign-in could not complete at all \u2014 the user-mapping function was called with the wrong number of arguments, the nonce never returned from the provider, and the user was never actually logged in.<\/li>\n<li><strong>Fixed:<\/strong> the attribute mapping was applied in the wrong direction, so no claim was ever mapped.<\/li>\n<li><strong>Fixed:<\/strong> an existing user was re-created on every sign-in instead of being updated.<\/li>\n<li><strong>Fixed:<\/strong> deleting a provider caused the next one created to overwrite an existing configuration.<\/li>\n<li><strong>Fixed:<\/strong> refreshing the registration screen created duplicate providers.<\/li>\n<li><strong>Fixed:<\/strong> LinkedIn used scopes that LinkedIn has retired; the preset now uses OpenID Connect.<\/li>\n<li><strong>Changed:<\/strong> provider logos are bundled with the plugin instead of being loaded from third-party CDNs.<\/li>\n<li><strong>Changed:<\/strong> presets added for GitLab, Slack, Amazon, Twitch, Salesforce, AWS Cognito, Dropbox, Zoom, Spotify, Bitbucket, Microsoft Entra ID and generic OpenID Connect.<\/li>\n<li><strong>Changed:<\/strong> admin scripts and styles are only loaded on the plugin's own screens.<\/li>\n<\/ul>","raw_excerpt":"Let visitors sign in to WordPress with an external OAuth 2.0 or OpenID Connect account, using ready-made presets or your own provider.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/205354","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=205354"}],"author":[{"embeddable":true,"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/secufor"}],"wp:attachment":[{"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=205354"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=205354"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=205354"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=205354"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=205354"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=205354"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}