{"id":23754,"date":"2022-09-07T09:26:23","date_gmt":"2022-09-07T09:26:23","guid":{"rendered":"https:\/\/refiner.io\/docs\/?post_type=knowledgebase&#038;p=23754"},"modified":"2026-09-03T16:06:55","modified_gmt":"2026-09-03T16:06:55","slug":"identity-verification","status":"publish","type":"knowledgebase","link":"https:\/\/refiner.io\/docs\/kb\/data-index\/identity-verification\/","title":{"rendered":"Identity Verification"},"content":{"rendered":"\n\n\n<h2 class=\"wp-block-heading\">Introduction<\/h2>\n\n\n\n<p>IIdentity Verification is an additional security mechanism that protects your Refiner installation from unauthorized third-party requests.<\/p>\n\n\n\n<p>It prevents third parties from impersonating your users or creating bogus user profiles by requiring requests to include a cryptographic signature that only your backend can generate.<\/p>\n\n\n\n<p>We highly recommend enabling Identity Verification in production environments.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How Identity Verification works<\/h2>\n\n\n\n<p>When Identity Verification is enabled, requests involving an identified user must include a valid signature for that user.<\/p>\n\n\n\n<p>The signature is unique to each user and is generated on your backend using the user&#8217;s identifier and a Refiner API key.<\/p>\n\n\n\n<p>Requests without a user identifier or with an invalid signature are rejected by Refiner.<\/p>\n\n\n\n<p>Because the signature can only be generated by someone with access to your API key, third parties cannot simply use your Environment ID to impersonate users or create bogus user profiles.<\/p>\n\n\n\n<p><strong>Note:<\/strong> Identity Verification requires a unique identifier for each user. When enabled, the JavaScript SDK cannot be used in <a href=\"https:\/\/refiner.io\/docs\/kb\/concepts\/anonymous-vs-identified-users-mode\/\">Anonymous Mode<\/a>, and <a href=\"https:\/\/refiner.io\/docs\/kb\/pages\/personalize-survey-links\/\">Survey Links<\/a> must include a user identifier.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Enable Identity Verification<\/h2>\n\n\n\n<p>Open the Identity Verification settings in your Refiner environment and enable verification for the survey channels where you want to enforce it.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"534\" src=\"https:\/\/refiner.io\/docs\/wp-content\/uploads\/2022\/09\/Screenshot-2026-09-03-at-18.06.26-1024x534.png\" alt=\"\" class=\"wp-image-28996\" srcset=\"https:\/\/refiner.io\/docs\/wp-content\/uploads\/2022\/09\/Screenshot-2026-09-03-at-18.06.26-1024x534.png 1024w, https:\/\/refiner.io\/docs\/wp-content\/uploads\/2022\/09\/Screenshot-2026-09-03-at-18.06.26-800x417.png 800w, https:\/\/refiner.io\/docs\/wp-content\/uploads\/2022\/09\/Screenshot-2026-09-03-at-18.06.26-768x401.png 768w, https:\/\/refiner.io\/docs\/wp-content\/uploads\/2022\/09\/Screenshot-2026-09-03-at-18.06.26-1536x801.png 1536w, https:\/\/refiner.io\/docs\/wp-content\/uploads\/2022\/09\/Screenshot-2026-09-03-at-18.06.26.png 1706w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n<p>You can initially leave Identity Verification disabled while implementing and testing signatures. Refiner will validate signatures when they are provided but will continue to accept requests without one.<\/p>\n\n\n\n<p>Once your implementation is working correctly, enable Identity Verification to reject unsigned requests.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Create an API key<\/h2>\n\n\n\n<p>Go to <strong>Settings &gt; API Keys<\/strong> and create an <a href=\"https:\/\/refiner.io\/docs\/kb\/integrations\/api\/\">API key<\/a> that will be used to generate Identity Verification signatures.<\/p>\n\n\n\n<p>We recommend creating a dedicated API key for Identity Verification rather than sharing a key with other integrations.<\/p>\n\n\n\n<p><strong>Important:<\/strong> Your API key is a secret and must only be used in your backend. Never expose it in frontend JavaScript, HTML, a public code repository, or any other client-side code.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"enforcing-identity-verification\">Compute the signature<\/h2>\n\n\n\n<p>The Identity Verification signature is an <a href=\"https:\/\/en.wikipedia.org\/wiki\/HMAC\" target=\"_blank\" rel=\"noreferrer noopener\">HMAC<\/a> generated using SHA-256.<\/p>\n\n\n\n<p>Use the user&#8217;s identifier as the message and your Refiner API key as the secret key.<\/p>\n\n\n\n<p>The <code>USER_ID<\/code> must be the same identifier you later use when identifying the user with Refiner.<\/p>\n\n\n\n<p>For testing purposes, you can keep Identity Verification in your Refiner settings disabled (see above). When disabled, Refiner will validate provided signatures, but also accept requests without a signature.<\/p>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<p id=\"node-js\"><strong>Node.js<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import crypto from 'crypto'\n\nlet signature = crypto.createHmac('sha256', 'SECRET_KEY').update(USER_ID).digest('hex')<\/pre>\n\n\n\n<p id=\"php\"><strong>PHP<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$signature = hash_hmac('sha256', $userId, 'SECRET_KEY')<\/pre>\n\n\n\n<p id=\"ruby\"><strong>Ruby<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"ruby\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">signature = OpenSSL::HMAC.hexdigest('sha256', 'SECRET_KEY', USER_ID)<\/pre>\n\n\n\n<p><\/p>\n<\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"step-2-pass-the-signature-to-userflow-js\">Pass the signature to Refiner<\/h2>\n\n\n\n<p>Once generated on your backend, pass the signature together with the user&#8217;s identifier when identifying the user.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">JavaScript SDK<\/h3>\n\n\n\n<p>Pass the computed signature to the <code><a href=\"https:\/\/refiner.io\/docs\/kb\/javascript-client\/reference\/#signature\">identifyUser<\/a><\/code> method as described in our JavaScript Client Reference.<\/p>\n\n\n\n<p>If you use our <a href=\"https:\/\/refiner.io\/docs\/kb\/install-client\/google-tag-manager\/#identify\">Google Tag Manager<\/a> installation, provide the signature as a user trait using <code>identify_verification_signature<\/code> as the field identifier.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Mobile SDK<\/h3>\n\n\n\n<p>Pass the computed signature as an additional parameter to the <code><a href=\"https:\/\/refiner.io\/docs\/kb\/mobile-sdk\/mobile-sdk-reference\/#identify\">identifyUser<\/a><\/code> method.<\/p>\n\n\n\n<p>Refer to the SDK documentation for detailed implementation instructions:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/github.com\/refiner-io\/mobile-sdk-ios#identify-user\">iOS<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/refiner-io\/mobile-sdk-android#identify-user\">Android<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/refiner-io\/mobile-sdk-react-native#identify-user\">React Native<\/a><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Survey Pages<\/h3>\n\n\n\n<p>For Survey Links, pass the computed signature using the <code>signature<\/code> URL parameter.<\/p>\n\n\n\n<p>See our <a href=\"https:\/\/refiner.io\/docs\/kb\/pages\/personalize-survey-links\/\">Survey Link Personalization<\/a> documentation for details.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction IIdentity Verification is an additional security mechanism that protects your Refiner installation from unauthorized third-party requests. It prevents third parties from impersonating your users or creating bogus user profiles by requiring requests to include a cryptographic signature that only your backend can generate. We highly recommend enabling Identity Verification in production environments. How Identity [&#8230;]<\/p>\n<p><a class=\"btn btn-secondary understrap-read-more-link\" href=\"https:\/\/refiner.io\/docs\/kb\/data-index\/identity-verification\/\">Read More&#8230;<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","template":"","knowledgebase_tag":[],"class_list":["post-23754","knowledgebase","type-knowledgebase","status-publish","hentry","knowledgebase_cat-data-index"],"acf":[],"featured_image_urls_v2":{"full":"","thumbnail":"","medium":"","medium_large":"","large":"","1536x1536":"","2048x2048":"","ab-block-post-grid-landscape":"","ab-block-post-grid-square":"","gb-block-post-grid-landscape":"","gb-block-post-grid-square":""},"post_excerpt_stackable_v2":"<p>Introduction IIdentity Verification is an additional security mechanism that protects your Refiner installation from unauthorized third-party requests. It prevents third parties from impersonating your users or creating bogus user profiles by requiring requests to include a cryptographic signature that only your backend can generate. We highly recommend enabling Identity Verification in production environments. How Identity Verification works When Identity Verification is enabled, requests involving an identified user must include a valid signature for that user. The signature is unique to each user and is generated on your backend using the user&#8217;s identifier and a Refiner API key. Requests without a&hellip;<\/p>\n","category_list_v2":"","author_info_v2":{"name":"Moritz Dausinger","url":"https:\/\/refiner.io\/docs\/author\/user\/"},"comments_num_v2":"0 comments","yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v23.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Identity Verification<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/refiner.io\/docs\/kb\/data-index\/identity-verification\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Identity Verification\" \/>\n<meta property=\"og:description\" content=\"Introduction IIdentity Verification is an additional security mechanism that protects your Refiner installation from unauthorized third-party requests. It prevents third parties from impersonating your users or creating bogus user profiles by requiring requests to include a cryptographic signature that only your backend can generate. We highly recommend enabling Identity Verification in production environments. How Identity [...]Read More...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/refiner.io\/docs\/kb\/data-index\/identity-verification\/\" \/>\n<meta property=\"og:site_name\" content=\"Refiner Documentation\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-03T16:06:55+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/refiner.io\/docs\/wp-content\/uploads\/2022\/09\/Screenshot-2026-09-03-at-18.06.26-1024x534.png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/refiner.io\/docs\/kb\/data-index\/identity-verification\/\",\"url\":\"https:\/\/refiner.io\/docs\/kb\/data-index\/identity-verification\/\",\"name\":\"Identity Verification\",\"isPartOf\":{\"@id\":\"https:\/\/refiner.io\/docs\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/refiner.io\/docs\/kb\/data-index\/identity-verification\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/refiner.io\/docs\/kb\/data-index\/identity-verification\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/refiner.io\/docs\/wp-content\/uploads\/2022\/09\/Screenshot-2026-09-03-at-18.06.26-1024x534.png\",\"datePublished\":\"2022-09-07T09:26:23+00:00\",\"dateModified\":\"2026-09-03T16:06:55+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/refiner.io\/docs\/kb\/data-index\/identity-verification\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/refiner.io\/docs\/kb\/data-index\/identity-verification\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/refiner.io\/docs\/kb\/data-index\/identity-verification\/#primaryimage\",\"url\":\"https:\/\/refiner.io\/docs\/wp-content\/uploads\/2022\/09\/Screenshot-2026-09-03-at-18.06.26.png\",\"contentUrl\":\"https:\/\/refiner.io\/docs\/wp-content\/uploads\/2022\/09\/Screenshot-2026-09-03-at-18.06.26.png\",\"width\":1706,\"height\":890},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/refiner.io\/docs\/kb\/data-index\/identity-verification\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/refiner.io\/docs\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Identity Verification\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/refiner.io\/docs\/#website\",\"url\":\"https:\/\/refiner.io\/docs\/\",\"name\":\"Refiner Documentation\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/refiner.io\/docs\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/refiner.io\/docs\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/refiner.io\/docs\/#organization\",\"name\":\"Refiner Documentation\",\"url\":\"https:\/\/refiner.io\/docs\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/refiner.io\/docs\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/refiner.io\/docs\/wp-content\/uploads\/2022\/11\/cropped-Group-8.png\",\"contentUrl\":\"https:\/\/refiner.io\/docs\/wp-content\/uploads\/2022\/11\/cropped-Group-8.png\",\"width\":400,\"height\":61,\"caption\":\"Refiner Documentation\"},\"image\":{\"@id\":\"https:\/\/refiner.io\/docs\/#\/schema\/logo\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Identity Verification","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/refiner.io\/docs\/kb\/data-index\/identity-verification\/","og_locale":"en_US","og_type":"article","og_title":"Identity Verification","og_description":"Introduction IIdentity Verification is an additional security mechanism that protects your Refiner installation from unauthorized third-party requests. It prevents third parties from impersonating your users or creating bogus user profiles by requiring requests to include a cryptographic signature that only your backend can generate. We highly recommend enabling Identity Verification in production environments. How Identity [...]Read More...","og_url":"https:\/\/refiner.io\/docs\/kb\/data-index\/identity-verification\/","og_site_name":"Refiner Documentation","article_modified_time":"2026-09-03T16:06:55+00:00","og_image":[{"url":"https:\/\/refiner.io\/docs\/wp-content\/uploads\/2022\/09\/Screenshot-2026-09-03-at-18.06.26-1024x534.png"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/refiner.io\/docs\/kb\/data-index\/identity-verification\/","url":"https:\/\/refiner.io\/docs\/kb\/data-index\/identity-verification\/","name":"Identity Verification","isPartOf":{"@id":"https:\/\/refiner.io\/docs\/#website"},"primaryImageOfPage":{"@id":"https:\/\/refiner.io\/docs\/kb\/data-index\/identity-verification\/#primaryimage"},"image":{"@id":"https:\/\/refiner.io\/docs\/kb\/data-index\/identity-verification\/#primaryimage"},"thumbnailUrl":"https:\/\/refiner.io\/docs\/wp-content\/uploads\/2022\/09\/Screenshot-2026-09-03-at-18.06.26-1024x534.png","datePublished":"2022-09-07T09:26:23+00:00","dateModified":"2026-09-03T16:06:55+00:00","breadcrumb":{"@id":"https:\/\/refiner.io\/docs\/kb\/data-index\/identity-verification\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/refiner.io\/docs\/kb\/data-index\/identity-verification\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/refiner.io\/docs\/kb\/data-index\/identity-verification\/#primaryimage","url":"https:\/\/refiner.io\/docs\/wp-content\/uploads\/2022\/09\/Screenshot-2026-09-03-at-18.06.26.png","contentUrl":"https:\/\/refiner.io\/docs\/wp-content\/uploads\/2022\/09\/Screenshot-2026-09-03-at-18.06.26.png","width":1706,"height":890},{"@type":"BreadcrumbList","@id":"https:\/\/refiner.io\/docs\/kb\/data-index\/identity-verification\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/refiner.io\/docs\/"},{"@type":"ListItem","position":2,"name":"Identity Verification"}]},{"@type":"WebSite","@id":"https:\/\/refiner.io\/docs\/#website","url":"https:\/\/refiner.io\/docs\/","name":"Refiner Documentation","description":"","publisher":{"@id":"https:\/\/refiner.io\/docs\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/refiner.io\/docs\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/refiner.io\/docs\/#organization","name":"Refiner Documentation","url":"https:\/\/refiner.io\/docs\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/refiner.io\/docs\/#\/schema\/logo\/image\/","url":"https:\/\/refiner.io\/docs\/wp-content\/uploads\/2022\/11\/cropped-Group-8.png","contentUrl":"https:\/\/refiner.io\/docs\/wp-content\/uploads\/2022\/11\/cropped-Group-8.png","width":400,"height":61,"caption":"Refiner Documentation"},"image":{"@id":"https:\/\/refiner.io\/docs\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/refiner.io\/docs\/wp-json\/wp\/v2\/knowledgebase\/23754","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/refiner.io\/docs\/wp-json\/wp\/v2\/knowledgebase"}],"about":[{"href":"https:\/\/refiner.io\/docs\/wp-json\/wp\/v2\/types\/knowledgebase"}],"author":[{"embeddable":true,"href":"https:\/\/refiner.io\/docs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/refiner.io\/docs\/wp-json\/wp\/v2\/comments?post=23754"}],"version-history":[{"count":31,"href":"https:\/\/refiner.io\/docs\/wp-json\/wp\/v2\/knowledgebase\/23754\/revisions"}],"predecessor-version":[{"id":28997,"href":"https:\/\/refiner.io\/docs\/wp-json\/wp\/v2\/knowledgebase\/23754\/revisions\/28997"}],"wp:attachment":[{"href":"https:\/\/refiner.io\/docs\/wp-json\/wp\/v2\/media?parent=23754"}],"wp:term":[{"taxonomy":"knowledgebase_tag","embeddable":true,"href":"https:\/\/refiner.io\/docs\/wp-json\/wp\/v2\/knowledgebase_tag?post=23754"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}