{"id":242189,"date":"2025-07-21T13:29:09","date_gmt":"2025-07-21T13:29:09","guid":{"rendered":"https:\/\/en-gb.wordpress.org\/plugins\/qrogin-qr-widgets\/"},"modified":"2025-07-21T16:01:27","modified_gmt":"2025-07-21T16:01:27","slug":"qrogin-qr-widgets","status":"publish","type":"plugin","link":"https:\/\/bal.wordpress.org\/plugins\/qrogin-qr-widgets\/","author":23328406,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.0.0","stable_tag":"1.0.0","tested":"6.5.8","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"Qrogin QR Widgets","header_author":"NKChakshu","header_description":"Widgets that displays time-limited one-time QR codes and or Buttons for QROGIN authentication.","assets_banners_color":"","last_updated":"2025-07-21 16:01:27","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/qrogin.com\/AboutUs","rating":0,"author_block_rating":0,"active_installs":0,"downloads":255,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"nkchakshu","date":"2025-07-21 16:01:27"}},"upgrade_notice":{"1.0.0":"<p>Initial version \u2013 nothing to worry about.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3331553,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3331553,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3331536,"resolution":"1","location":"assets","locale":""}},"screenshots":{"1":"QR widget and Secure Link Button in action (screenshot-1.png)"},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[710,602,2061,218738,7312],"plugin_category":[38],"plugin_contributors":[245194],"plugin_business_model":[],"class_list":["post-242189","plugin","type-plugin","status-publish","hentry","plugin_tags-authentication","plugin_tags-login","plugin_tags-oauth","plugin_tags-passkey","plugin_tags-qr","plugin_category-authentication","plugin_contributors-nkchakshu","plugin_committers-nkchakshu"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/qrogin-qr-widgets\/assets\/icon-128x128.png?rev=3331553","icon_2x":"https:\/\/ps.w.org\/qrogin-qr-widgets\/assets\/icon-256x256.png?rev=3331553","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/qrogin-qr-widgets\/assets\/screenshot-1.png?rev=3331536","caption":"QR widget and Secure Link Button in action (screenshot-1.png)"}],"raw_content":"<!--section=description-->\n<p>QROGIN is a developer-friendly QR based social login platform delivering FIDO2 passkey-powered passwordless authentication, combining enterprise-grade security with easy integration and seamless identity management.\nUsing this plugin, developers will be able to generate tamper\u2011proof (time-limited &amp; one-time use) QR codes and secure one\u2011click links(button) for QROGIN user-login\/signup. The widgets talks to your QROGIN back\u2011end, displays a countdown, polls for authentication and then fires a JavaScript event so you can finish the flow your way.<\/p>\n\n<p><strong>Features<\/strong><\/p>\n\n<ul>\n<li>Three modes: <code>QrWidget<\/code>, <code>QrWithLink<\/code>, <code>SecureLinkButton<\/code><\/li>\n<li>Customise colours, labels and CSS classes from the shortcode<\/li>\n<li>Accessible: countdown and refresh button included<\/li>\n<li>Event\u2011driven \u2013 hook into <code>qrogin-authenticated<\/code> for SPA redirects<\/li>\n<li>Works on any page\/post or block editor pattern<\/li>\n<\/ul>\n\n<h3>Shortcode<\/h3>\n\n<p>[qrogin_qr_widgets]<\/p>\n\n<p>Attributes:\nSee the \"Attribute Reference\" section below for all options.<\/p>\n\n<h3>Attribute Reference<\/h3>\n\n<ul>\n<li>base_url (required) \u2013 Endpoint that returns QR payload<\/li>\n<li>status_base (required) \u2013 Endpoint polled to read auth status<\/li>\n<li>tenant_id (required) \u2013 Your tenant\/account ID<\/li>\n<li>api_key (required) \u2013 API key issued by QROGIN<\/li>\n<li>mode \u2013 QrWidget (default), QrWithLink, or SecureLinkButton<\/li>\n<li>ttl_ms \u2013 Time\u2011to\u2011live in milliseconds (default: 55000)<\/li>\n<li>poll_interval \u2013 Polling gap in milliseconds (default: 5000)<\/li>\n<li>class \u2013 Extra classes for the widget wrapper<\/li>\n<li>button_label \u2013 Button inner HTML (default: \"Secure one\u2011time link\")<\/li>\n<li>button_class \u2013 Extra classes for the button<\/li>\n<li>button_style \u2013 Inline CSS for the button<\/li>\n<\/ul>\n\n<h3>Usage example: catching the authentication event<\/h3>\n\n<p>Add this script to your page (you can adjust the redirect URL):<\/p>\n\n<pre><code>&lt;script&gt;\ndocument.querySelectorAll('.qrogin-qr-container').forEach(el =&gt; {\n  el.addEventListener('qrogin-authenticated', e =&gt; {\n    const { token, user_id } = e.detail;\n    sessionStorage.setItem('qroginJwt', token);\n    sessionStorage.setItem('userId', user_id);\n    \/\/ Redirect to a safe location\n    window.location.href = '\/account'; \/\/ &lt;- change this\n  });\n});\n&lt;\/script&gt;&lt;h3&gt;Privacy&lt;\/h3&gt;\n<\/code><\/pre>\n\n<p>This plugin sends only the fields you configure\u2014<code>tenant_id<\/code> (also known as customer_id), <code>api_key<\/code>, and associated session data\u2014to <strong>your own<\/strong> QROGIN back\u2011end. All traffic travels over <strong>HTTPS<\/strong> to QROGIN\u2011owned sub\u2011domains (<code>*.qrogin.com<\/code>) only. No data is transmitted to the plugin author or any other third\u2011party service.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code> and activate it.<\/li>\n<li><p>Place the shortcode where you need the QR:<\/p>\n\n<p><code>[qrogin_qr_widgets base_url=\"https:\/\/sample.qrogin.com\/qr (sample url - actual url will be provided privately)\" status_base=\"https:\/\/sample.qrogin.com\/status (sample url - actual url will be provided privately)\" tenant_id=\"ACME123\" api_key=\"YOUR_API_KEY\" mode=\"QrWidget\" (or QrWithLink or SecureLinkButton) ttl_ms=\"55000\" poll_interval=\"5000\" class=\"my-wrapper\" button_label=\"Secure one\u2011time link\" button_class=\"btn btn-primary\" button_style=\"font-size:20px\"\n]<\/code><\/p><\/li>\n<\/ol>\n\n<p><strong>Important:<\/strong> Both <code>base_url<\/code> and <code>status_base<\/code> must be <strong>HTTPS<\/strong> endpoints hosted on a <code>qrogin.com<\/code> sub\u2011domain (e.g. <code>https:\/\/auth.qrogin.com\/...<\/code>).<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id='the%20qr%20never%20changes%20colour%20%E2%80%93%20what%20gives%3F'><h3>The QR never changes colour \u2013 what gives?<\/h3><\/dt>\n<dd><p>Check your browser console for CORS errors. The <code>base_url<\/code> and <code>status_base<\/code> <strong>must<\/strong> be served over HTTPS and send the correct CORS headers.<\/p><\/dd>\n<dt id='does%20it%20work%20with%20page%20builders%3F'><h3>Does it work with page builders?<\/h3><\/dt>\n<dd><p>Yes. The shortcode can be dropped into any text\/html block.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First public release.<\/li>\n<\/ul>","raw_excerpt":"QROGIN offers passkey-based QR login with tamper-proof codes, one-click links, countdown timer, auth polling and JS event for easy integration.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/242189","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=242189"}],"author":[{"embeddable":true,"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/nkchakshu"}],"wp:attachment":[{"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=242189"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=242189"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=242189"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=242189"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=242189"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=242189"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}