<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Zuar Web Application Firewall]]></title><description><![CDATA[Help Center Documentation]]></description><link>https://www.zuar.com/help/waf/</link><image><url>https://www.zuar.com/help/waf/favicon.png</url><title>Zuar Web Application Firewall</title><link>https://www.zuar.com/help/waf/</link></image><generator>Ghost 2.37</generator><lastBuildDate>Sun, 07 Jun 2026 23:19:50 GMT</lastBuildDate><atom:link href="https://www.zuar.com/help/waf/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Overview]]></title><description><![CDATA[Welcome to the help documentation for the Zuar Web Application Firewall (ZWAF).]]></description><link>https://www.zuar.com/help/waf/overview/</link><guid isPermaLink="false">5dfaa0aa908ca9000118f612</guid><category><![CDATA[Overview]]></category><dc:creator><![CDATA[Justin Freels]]></dc:creator><pubDate>Wed, 18 Dec 2019 21:57:27 GMT</pubDate><content:encoded><![CDATA[<p>Welcome to the help documentation for the Zuar Web Application Firewall (ZWAF).</p><p>Here are links to documentation for Zuar's other products:</p><ul><li><a href="https://www.zuar.com/help/mitto/">Mitto</a></li><li><a href="https://www.zuar.com/help/rapid-portal/">Rapid Portal</a></li><li><a href="https://www.zuar.com/help/custom-portal/">Custom Portal</a></li></ul><p>More content is available on <a href="https://www.zuar.com/blog/">Zuar's blog</a>.</p><p>Join the <a href="https://community.zuar.com/">Zuar community</a> and <a href="https://community.zuar.com/c/waf/6">discuss WAF</a>!</p><h2 id="what-is-the-zuar-web-application-firewall">What is the Zuar Web Application Firewall?</h2><p>The Zuar Web Application Firewall (ZWAF) is a software based web application firewall. It handles all security (authorization and authentication) aspects for all of Zuar's products: </p><ul><li><a href="https://www.zuar.com/help/mitto">Mitto</a></li><li><a href="https://www.zuar.com/help/rapid-portal">Rapid Portal</a></li><li><a href="https://www.zuar.com/help/custom-portal">Custom Portal</a></li></ul><h2 id="architecture">Architecture</h2><p>The WAF was developed with web application best practices in mind:</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://www.zuar.com/help/waf/content/images/2020/03/zuar-waf-1.png" class="kg-image"></figure><!--kg-card-end: image--><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://www.zuar.com/help/waf/content/images/2020/03/image-12.png" class="kg-image"></figure><!--kg-card-end: image--><ul><li><strong>Web Server</strong> - Acts as a gateway to your application server and serves up static files (images, JavaScript, CSS, etc). Also handles routing of data to 1 or more application servers.</li><li><strong>Application Server</strong> - Becomes IdP for your web server. Handles authentication to avoid security risks.</li></ul>]]></content:encoded></item><item><title><![CDATA[Tableau Integration]]></title><description><![CDATA[<h2 id="tableau-authentication">Tableau Authentication</h2><p>WAF can be configured to use <a href="https://www.zuar.com/help/waf/tableau-authentication/">Tableau Server/Online for authentication</a>. </p><h2 id="tableau-apis">Tableau APIs</h2><p>When the WAF is configured with Tableau Server/Online, many of the Tableau APIs become available to authenticated users:</p><ul><li><a href="https://www.zuar.com/help/waf/tableau-javascript-api/">Tableau JavaScript API</a></li><li><a href="https://www.zuar.com/help/waf/tableau-rest-api/">Tableau REST API</a></li><li><a href="https://www.zuar.com/help/waf/tableau-trusted-authentication-api/">Tableau Trusted Authentication API</a></li></ul><h2 id="tableau-configuration">Tableau Configuration</h2><p>Configuring a Zuar Portal</p>]]></description><link>https://www.zuar.com/help/waf/tableau-integration/</link><guid isPermaLink="false">601eb948348a9300011e5ba3</guid><category><![CDATA[Tableau Integration]]></category><dc:creator><![CDATA[Justin Freels]]></dc:creator><pubDate>Sat, 06 Feb 2021 15:44:32 GMT</pubDate><content:encoded><![CDATA[<h2 id="tableau-authentication">Tableau Authentication</h2><p>WAF can be configured to use <a href="https://www.zuar.com/help/waf/tableau-authentication/">Tableau Server/Online for authentication</a>. </p><h2 id="tableau-apis">Tableau APIs</h2><p>When the WAF is configured with Tableau Server/Online, many of the Tableau APIs become available to authenticated users:</p><ul><li><a href="https://www.zuar.com/help/waf/tableau-javascript-api/">Tableau JavaScript API</a></li><li><a href="https://www.zuar.com/help/waf/tableau-rest-api/">Tableau REST API</a></li><li><a href="https://www.zuar.com/help/waf/tableau-trusted-authentication-api/">Tableau Trusted Authentication API</a></li></ul><h2 id="tableau-configuration">Tableau Configuration</h2><p>Configuring a Zuar Portal to use Tableau Server/Online is done via the Portal's <a href="https://www.zuar.com/help/waf/env/">env file</a>:</p><ul><li><strong>TABLEAU_SERVER_URL</strong> - This is the URL of the Tableau Server/Online (e.g. <code>https://tableau.zuar.com</code> or <code>https://us-east-1.online.tableau.com/</code>).</li><li><strong>TABLEAU_SERVER_SITE</strong> - This is the site of the Tableau Server/Online.</li><li><strong>TABLEAU_SERVER_USERNAME</strong> - <em>(Optional)</em> This is the username of a Tableau Server server administrator account. This is used for <a href="https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_concepts_auth.htm#impersonating_a_user">Tableau REST API impersonation</a>.</li><li><strong>TABLEAU_SERVER_PASSWORD </strong>-<em> (Optional)</em> This is the password of a Tableau Server server administrator account. This is used for <a href="https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_concepts_auth.htm#impersonating_a_user">Tableau REST API impersonation</a>.</li></ul><h2 id="tableau-server-online-server-and-site">Tableau Server/Online Server and Site</h2><h3 id="what-is-my-tableau-server-online-url">What is my Tableau Server/Online URL?</h3><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://www.zuar.com/help/rapid-portal/content/images/2020/03/image-3.png" class="kg-image"></figure><!--kg-card-end: image--><h3 id="what-is-my-tableau-server-online-site">What is my Tableau Server/Online site?</h3><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://www.zuar.com/help/rapid-portal/content/images/2020/03/image-4.png" class="kg-image"></figure><!--kg-card-end: image--><p>If you are using the <code>Default</code> site you won't see the word <code>site</code> in your Tableau URL. For example:</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://www.zuar.com/help/rapid-portal/content/images/2020/03/image-5.png" class="kg-image"></figure><!--kg-card-end: image-->]]></content:encoded></item><item><title><![CDATA[Architecture Overview]]></title><description><![CDATA[<h2 id="architecture">Architecture</h2><p>The Zuar Web Application Firewall (WAF)  architecture consists of a standard web server, an authentication micro service, and by default a <a href="https://www.postgresql.org/">PostgreSQL</a> database.  The design is modular, with well defined interfaces among the components, so both the authentication service and PostgreSQL may be replaced with suitably similar technology.</p><h3 id="web-server">Web</h3>]]></description><link>https://www.zuar.com/help/waf/architecture-overview/</link><guid isPermaLink="false">5dfa953a908ca9000118f5e2</guid><category><![CDATA[Overview]]></category><dc:creator><![CDATA[Justin Freels]]></dc:creator><pubDate>Wed, 18 Dec 2019 21:08:23 GMT</pubDate><content:encoded><![CDATA[<h2 id="architecture">Architecture</h2><p>The Zuar Web Application Firewall (WAF)  architecture consists of a standard web server, an authentication micro service, and by default a <a href="https://www.postgresql.org/">PostgreSQL</a> database.  The design is modular, with well defined interfaces among the components, so both the authentication service and PostgreSQL may be replaced with suitably similar technology.</p><h3 id="web-server">Web Server</h3><p>The web server is the industry-standard, open-source <a href="https://www.nginx.com/">NGINX</a> server with additional embedded modules to handle aspects of authorization. The entire authentication validation mechanism runs in the context of the web server itself, resulting in optimal performance.</p><h3 id="authentication-micro-service">Authentication Micro Service</h3><p>The authentication micro service (<code>auth</code> service) only handles requests specifically for login and logout and is responsible validating the user and assigning user permissions.</p><p>Users can be authenticated in one of several ways: </p><ol><li>Against the local database</li><li>Against an optionally configured Tableau Server/Online. </li><li>Using a custom built authentication module.</li></ol><p>If a given user is not found in the local database, then the configured Tableau Server is tried. A common deployment is to have no local users so that Tableau Server is used exclusively for authentication. To use the SAML terminology, the Tableau Server acts as an Identity Provider (IdP).</p><p>User information - including authorization information, but NOT their password - is stored in a <a href="https://jwt.io/">JSON Web Token</a> (JWT). The JWTs are digitally signed with the HMAC SHA256 encryption algorithm (HS256) and are validated both for time and originating IP address.</p><p>The default portal configuration proxies all requests to the <code>/api</code> URI directly to the configured <a href="https://www.tableau.com/products/server">Tableau Server</a> / <a href="https://www.tableau.com/products/cloud-bi">Tableau Online</a>. This results in the <a href="https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api.htm">Tableau REST API</a> being accessible to the front-end in a secure fashion that is not possible without the portal. Front-end, JavaScript code may make calls directly to the Tableau REST API without having to build an intermediary API as is normally required.</p><h2 id="workflow">Workflow</h2><p>Here is the workflow when a user accesses a WAF for the first time, where the WAF has the default configuration using Tableau Server as the IdP.</p><ul><li>User accesses the portal URL with a browser, say <code>https://example.zuar.com</code></li><li>Since the user has never logged in, they don't yet have a JWT so they are automatically redirected to the login page at <code>https://example.zuar.com/login</code>.</li><li>This URL is proxied by the web server to the auth service which responds to the GET request with a standard login form.</li><li>The user inputs their username and password which is submitted back to <code>https://example.zuar.com/login</code> as a POST request.</li><li>The auth service takes the information and compares it against its local users.<br>If the user is not found - the normal case - then the information is sent to Tableau Server/Online for validation.</li><li>Assuming the user information is valid, then Tableau Server responds to the auth request with general user information, e.g. display name, user id, email, etc.</li><li>Once a successful response from Tableau Server is received, the auth service generates a JWT and includes the information it received fromTableau Server in the payload. The payload information can be used by downstream services - for example, to display the full name of the logged in user.</li><li>The auth service responds with a redirect (302 Found) back to the original location with the JWT sent as a cookie in the response.</li><li>The user is automatically redirected back to <code>https://example.zuar.com</code> but now has a valid JWT so the web server validates the request handle and returns the default web application.</li></ul><h1 id="deployment">Deployment</h1><p>The web server, auth server, and PostgreSQL database are all deployed using <a href="https://www.zuar.com/help/waf/docker/">Docker</a>.<br>Each component is a separate Docker container with all containers orchestrated by <code>docker-compose</code>.</p><p>There is one <code>docker-compose.yaml</code> file that controls all containers and<br>an environment file for sensitive information as per <a href="https://12factor.net/">12factor</a> methodology.</p><p>The NGINX configuration are mounted as volumes so they may be customized as desired.</p><h2 id="security">Security</h2><ul><li>Built using proven, open-source technology for base request handling.</li><li>Design follows all <a href="https://owasp.org">OWASP</a> security guidelines</li><li>All passwords are stored using a <a href="https://en.wikipedia.org/wiki/PBKDF2">PBKDF2</a> SHA512 one-way hash. At no point are passwords stored either in the clear or using reversible encryption.</li><li>Built-in <a href="https://modsecurity.org/">ModSecurity</a>.</li></ul><p>The portal acts as a WAF/reverse proxy for Tableau Server as <a href="https://help.tableau.com/current/server/en-us/proxy.htm#how-a-reverse-proxy-works-with-tableau-server">per Tableau guidelines</a>. All external traffic to the application - including to Tableau Server / Tableau Online - can be logged and audited as desired to meet any security requirements. The </p><h2 id="configuration">Configuration</h2><p>The Zuar Web Application Firewall (WAF) handles all aspect of authentication and authorization so that the application developer only has to implement their business logic. </p><p>This methodology is particularly useful when building an application utilizing Tableau for embedded analytics.</p><p>Since the WAF is designed to be starting point for third-party applications, it is extensively configurable. All standard NGINX configuration is available and can be used by the application. The WAF automatically passes all user information from the JWT to downstream application via HTTP headers using a prefix <code>X-Payload-</code>.</p>]]></content:encoded></item><item><title><![CDATA[Salesforce Connected App]]></title><description><![CDATA[<h2 id="overview">Overview</h2><p>The Zuar Web Application Firewall (WAF) can integrate with Salesforce via a <a href="https://developer.salesforce.com/docs/atlas.en-us.platform_connect.meta/platform_connect/canvas_framework_intro.htm">Salesforce Canvas App</a>. </p><blockquote>Canvas enables you to easily integrate a third-party application in Salesforce.</blockquote><p><a href="https://developer.salesforce.com/docs/atlas.en-us.platform_connect.meta/platform_connect/canvas_framework_using_vf_intro.htm">Canvas Apps and VisualForce Pages</a></p><blockquote>In addition to standard canvas apps, Canvas also lets you expose a canvas app on a Visualforce page.</blockquote>]]></description><link>https://www.zuar.com/help/waf/salesforce-connected-app/</link><guid isPermaLink="false">5dfbbb15908ca9000118f62d</guid><category><![CDATA[Salesforce Integration]]></category><dc:creator><![CDATA[Justin Freels]]></dc:creator><pubDate>Wed, 29 Jul 2020 19:32:14 GMT</pubDate><content:encoded><![CDATA[<h2 id="overview">Overview</h2><p>The Zuar Web Application Firewall (WAF) can integrate with Salesforce via a <a href="https://developer.salesforce.com/docs/atlas.en-us.platform_connect.meta/platform_connect/canvas_framework_intro.htm">Salesforce Canvas App</a>. </p><blockquote>Canvas enables you to easily integrate a third-party application in Salesforce.</blockquote><p><a href="https://developer.salesforce.com/docs/atlas.en-us.platform_connect.meta/platform_connect/canvas_framework_using_vf_intro.htm">Canvas Apps and VisualForce Pages</a></p><blockquote>In addition to standard canvas apps, Canvas also lets you expose a canvas app on a Visualforce page. This means you can display a canvas app anywhere you can display a Visualforce page.</blockquote><p>The steps below are one time setup on the Salesforce side. These steps require a Salesforce administrator account.</p><h2 id="create-a-salesforce-connected-app">Create a Salesforce Connected App</h2><p>In the Salesforce UI, click <strong><strong>Setup</strong></strong>.</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://www.zuar.com/blog/content/images/2020/02/image-37.png" class="kg-image"></figure><!--kg-card-end: image--><p>Search for <strong><strong>"</strong>A<strong>pp </strong>M<strong>anager"</strong></strong> and click <strong><strong>App Manager</strong></strong>.</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://www.zuar.com/blog/content/images/2020/02/image-38.png" class="kg-image"></figure><!--kg-card-end: image--><p>Click <strong><strong>"New Connected App"</strong></strong>.</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://www.zuar.com/blog/content/images/2020/02/image-39.png" class="kg-image"></figure><!--kg-card-end: image--><p>Fill out the <strong>"New Connected App"</strong> form. <em><em>Not all values are required.</em></em></p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://www.zuar.com/blog/content/images/2020/02/image-41.png" class="kg-image"></figure><!--kg-card-end: image--><h3 id="basic-information"><strong>Basic Information</strong></h3><ul><li><strong><strong>Connected App Name:</strong></strong> (e.g. "Zuar Rapid Portal")</li><li><strong><strong>API Name:</strong></strong> (<em><em>requires all lowercase and underscores</em></em>) (e.g. "zuar_rapid_portal")</li><li><strong><strong>Contact Email</strong></strong>: your Salesforce admin's address</li></ul><h3 id="api-enable-oauth-settings-"><strong>API (Enable OAuth Settings)</strong></h3><ul><li>Check <strong><strong>Enable OAuth Settings</strong></strong></li><li><strong><strong>Callback URL: </strong></strong>https://{rapid_portal_url}/keepAlive (e.g. https://analytics.yourcompany.com/keepAlive)</li><li><strong><strong>Selected OAuth Scopes </strong></strong>- Select "Access your basic information (id, profile, email, address, phone)" and click <strong><strong>Add</strong></strong></li><li>Check <strong><strong>Require Secret for Web Server Flow</strong></strong></li></ul><h3 id="canvas-app-settings"><strong>Canvas App Settings</strong></h3><p>IMPORTANT: Depending on your Tableau environment you will use either the <strong>signed </strong>or <strong>vaulted </strong>endpoint for the Canvas App URL below. <strong>signed</strong> is used for Tableau Server with trusted authentication. <strong>vaulted</strong> is used for Tableau Server without trusted authentication and Tableau Online (which doesn't have trusted authentication). <strong>vaulted</strong> will prompt the Tableau user for their Tableau password once. If the user's password changes, the user will be prompted again, once.</p><ul><li>Check <strong><strong>Canvas</strong></strong></li><li><strong><strong>Canvas App URL: </strong></strong>https://{rapid_portal_url}/{<strong>signed</strong> or <strong>vaulted</strong>} (e.g. For Tableau Server with trusted authentication use https://analytics.yourcompany.com/<strong>signed</strong> and for Tableau Online use https://analytics.yourcompany.com/<strong>vaulted</strong>)</li><li><strong><strong>Access Method: </strong></strong>Signed Request (POST)</li><li><strong><strong>Locations: </strong></strong>Select "Visualforce Page" and click <strong><strong>Add</strong></strong></li></ul><p>Click <strong><strong>Save</strong></strong>.</p><p>Back on the "Manage Connected Apps" page, click <strong><strong>Manage.</strong></strong></p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://www.zuar.com/blog/content/images/2020/02/image-43.png" class="kg-image"></figure><!--kg-card-end: image--><p>Click "Edit Policies".</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://www.zuar.com/blog/content/images/2020/02/image-44.png" class="kg-image"></figure><!--kg-card-end: image--><h3 id="oauth-policies"><strong>OAuth Policies</strong></h3><ul><li><strong><strong>Permitted Users </strong></strong>- set to "Admin approved users are pre-authorized"</li></ul><p>Click <strong><strong>Save</strong></strong>.</p><p>There is a new section named <strong><strong>Profiles</strong></strong>. Click <strong><strong>Manage Profiles.</strong></strong></p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://www.zuar.com/blog/content/images/2020/02/image-45.png" class="kg-image"></figure><!--kg-card-end: image--><p>Check the box next to any profiles you wish to give access to and click <strong><strong>Save.</strong></strong></p><h2 id="save-the-salesforce-connected-app-s-consumer-secret">Save the Salesforce Connected App's Consumer Secret</h2><p></p><p>Go back to the <strong><strong>App Manager </strong></strong>(search <strong><strong>"app manager"</strong></strong>).</p><p>Find the newly created Connect App and click <strong><strong>View</strong></strong>.</p><p>In the <strong><strong>API (Enable OAuth Settings) </strong></strong>section, next to <strong><strong>Consumer Secret</strong></strong>, click <strong><strong>"Click to Reveal"</strong></strong>.</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.zuar.com/blog/content/images/2020/02/image-46.png" class="kg-image"></figure><!--kg-card-end: image--><p>Save the Connected App's Consumer Secret. This will be needed for configuration on the Zuar Rapid Portal.</p><h2 id="tableau-to-salesforce-user-mapping">Tableau to Salesforce User Mapping</h2><p>Usernames from Tableau Server/Online must be mapped to information from Salesforce (e.g. username, email).</p><p>Tableau Online usernames must be email addresses. Tableau Server usernames can be anything.</p><p>Salesforce requires that each username be unique and in the form of an email address. Learn more about <a href="https://help.salesforce.com/articleView?id=000325738&amp;type=1&amp;mode=1">Salesforce usernames</a>.</p><h3 id="user-mapping-options">User Mapping Options</h3><ul><li>userName</li><li>baseName</li><li>email</li><li>baseEmail</li></ul><h3 id="user-mapping-examples">User Mapping Examples</h3><!--kg-card-begin: markdown--><table>
<thead>
<tr>
<th style="text-align:right">Tableau Username</th>
<th>Salesforce Username</th>
<th>Salesforce Email</th>
<th>User Mapping Options</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:right"><a href="mailto:user1@company.com">user1@company.com</a></td>
<td><a href="mailto:user1@company.com">user1@company.com</a></td>
<td><a href="mailto:user1@company.com">user1@company.com</a></td>
<td>userName or email</td>
</tr>
<tr>
<td style="text-align:right">user1</td>
<td><a href="mailto:user1@company.com">user1@company.com</a></td>
<td><a href="mailto:user1@company.com">user1@company.com</a></td>
<td>baseName</td>
</tr>
<tr>
<td style="text-align:right"><a href="mailto:user1@company.com">user1@company.com</a></td>
<td><a href="mailto:user1+production@company.com">user1+production@company.com</a></td>
<td><a href="mailto:user1@company.com">user1@company.com</a></td>
<td>email</td>
</tr>
<tr>
<td style="text-align:right">user1</td>
<td><a href="mailto:user1+production@company.com">user1+production@company.com</a></td>
<td><a href="mailto:user1@company.com">user1@company.com</a></td>
<td>baseEmail</td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown--><p>Typically using the <strong>email</strong> user mapping makes the most sense for Tableau Online user mapping and <strong>email </strong>or <strong>baseEmail</strong> makes the most sense for Tableau Server user mapping.</p><h3 id="what-if-none-of-the-user-mappings-fit-your-naming-convention">What if None of the User Mappings Fit your Naming Convention?</h3><p>Let's say your Tableau and Salesforce usernames look like this:</p><!--kg-card-begin: markdown--><table>
<thead>
<tr>
<th style="text-align:right">Tableau Username</th>
<th>Salesforce Username</th>
<th>Salesforce Email</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:right">john_j_smith</td>
<td><a href="mailto:john@company.com">john@company.com</a></td>
<td><a href="mailto:johnjs@company.com">johnjs@company.com</a></td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown--><p>None of the four user mappings work for this Salesforce and Tableau naming convention:</p><ul><li><strong>userName</strong> - This would pass <code>john@company.com</code> from Salesforce to <code>john_j_smith</code><strong> </strong>on Tableau. Not a match.</li><li><strong>baseName</strong> - This would pass <code>john</code> from Salesforce to <code>john_j_smith</code> on Tableau. Not a match.</li><li><strong>email</strong> - This would pass <code>johnjs@company.com</code> from Salesforce to <code>john_j_smith</code><strong> </strong>on Tableau. Not a match.</li><li><strong>baseEmail</strong> - This would pass <code>johnjs</code> from Salesforce to <code>john_j_smith</code><strong> </strong>on Tableau. Not a match.</li></ul><p>There are a few extra Salesforce steps you can take to solve this:</p><ol><li>Create a custom field (e.g. <code>tableau_username__c</code>) on your Salesforce <code>User</code> object and for each Tableau user, populate the custom field with that user's corresponding Tableau username. In our example above, we would populate the <code>john@company.com</code> Salesforce user's custom field with <code>john_j_smith</code>.</li><li>Add a <code>username</code> parameter to the Visualforce APEX code that references this custom field. Read <a href="https://developer.salesforce.com/docs/atlas.en-us.pages.meta/pages/pages_quick_start_display_field_values.htm">Displaying Field Values in Visualforce</a>.</li></ol><!--kg-card-begin: code--><pre><code>&lt;apex:page &gt;
&lt;apex:canvasApp applicationName="{canvas_app}"
    maxHeight="infinite"
    width="100%"
    parameters="
    {
        'location': '/z/trusted/{tableau_view_url}',
        'username': '{! $User.tableau_username__c }'
    }" /&gt;
&lt;/apex:page&gt;</code></pre><!--kg-card-end: code--><p>If <code>username</code> exists as a parameter in the Visualforce code, the value of <code>username</code> will be used to map the Salesforce user to the Tableau user. </p><p>So for our example above, regardless of the user mapping that is defined on the Portal, the username <code>john_j_smith</code> would be passed to Tableau when <code>john@company</code> loads the Visualforce page.</p><p>See more information about the overall process of embedding Tableau into Salesforce here:</p><!--kg-card-begin: bookmark--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.zuar.com/blog/embedding-tableau-into-a-salesforce-visualforce/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Embedding Tableau Into Salesforce using Visualforce | Zuar</div><div class="kg-bookmark-description">Market-leading CRM platform Salesforce.com recently acquired Tableau
[https://investor.salesforce.com/press-releases/press-release-details/2019/Salesforce-Signs-Definitive-Agreement-to-Acquire-Tableau/default.aspx]
, an innovative data visualization
[https://www.zuar.com/blog/data-automation-improve-analysis-productivity/…</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.zuar.com/blog/favicon.ico"><span class="kg-bookmark-author">Justin Freels</span><span class="kg-bookmark-publisher">Zuar | Blog</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.zuar.com/blog/content/images/2020/08/salesforce-tableau-embed.png"></div></a></figure><!--kg-card-end: bookmark--><h2 id="next-steps-">Next steps:</h2><ol><li>Share your newly created Salesforce Connected App's Consumer Secret with Zuar either through your account manager or <a href="https://www.zuar.com/support">support</a>.</li><li>Share your Tableau to Salesforce user mapping naming convention with Zuar either through your account manager or <a href="https://www.zuar.com/support">support</a>.</li><li>Zuar will configure your Portal to use the Salesforce Connected App's Consumer Secret and User Mapping.</li><li><a href="https://www.zuar.com/help/waf/testing-salesforce-connected-app/">Test the Salesforce Connected App</a> after Zuar performs step 2 above.</li></ol>]]></content:encoded></item><item><title><![CDATA[Trusted Host for Tableau Server Trusted Authentication]]></title><description><![CDATA[<p>For embedded analytics use cases with <a href="https://www.tableau.com/products/server">Tableau Server</a>, one <a href="https://help.tableau.com/current/server/en-us/security_auth.htm">authentication</a> mechanism is <a href="https://help.tableau.com/current/server/en-us/trusted_auth.htm">trusted authentication</a>. This authentication mechanism is used when a third party application is handling authentication rather than Tableau Server directly, but the users still need a single sign on experience.</p><blockquote>Trusted authentication simply means that you have set</blockquote>]]></description><link>https://www.zuar.com/help/waf/trusted-host-for-tableau-server-trusted-authentication/</link><guid isPermaLink="false">5f21cee6b92e4500016f03cb</guid><category><![CDATA[Tableau Integration]]></category><dc:creator><![CDATA[Justin Freels]]></dc:creator><pubDate>Wed, 29 Jul 2020 19:40:29 GMT</pubDate><content:encoded><![CDATA[<p>For embedded analytics use cases with <a href="https://www.tableau.com/products/server">Tableau Server</a>, one <a href="https://help.tableau.com/current/server/en-us/security_auth.htm">authentication</a> mechanism is <a href="https://help.tableau.com/current/server/en-us/trusted_auth.htm">trusted authentication</a>. This authentication mechanism is used when a third party application is handling authentication rather than Tableau Server directly, but the users still need a single sign on experience.</p><blockquote>Trusted authentication simply means that you have set up a trusted relationship between Tableau Server and one or more web servers. When Tableau Server receives requests from these trusted web servers it assumes that your web server has handled whatever authentication is necessary.</blockquote><p>The Zuar WAF can act as the trusted host for Tableau Server and provide single sign on into embedded analytics applications (e.g. <a href="https://www.zuar.com/products/portal#rapid-portal">Zuar Rapid Portal</a>, <a href="https://www.zuar.com/products/portal#custom-portal">Zuar Custom Portal</a>, <a href="https://www.zuar.com/help/waf/salesforce-connected-app/">Salesforce</a>, or your own existing application).</p><h2 id="add-the-zuar-portal-s-hostname-or-ip-to-tableau-server">Add the Zuar Portal's Hostname or IP to Tableau Server</h2><p>For trusted tickets to work your Tableau Server administrator will need to add the hostname or IP Address of your Rapid Portal as a "Trusted Host" under <code>Configuration &gt; User Identity &amp; Access &gt; Trusted Authentication</code>, then save pending changes and restart.</p><p>Read Tableau Server documentation: <a href="https://help.tableau.com/current/server/en-us/trusted_auth_trustIP.htm">Add Trusted IP Addresses or Host Names to Tableau Server</a></p><p><strong>Tableau Trusted Authentication gotcha:</strong></p><blockquote>Static IP addresses are required: The web servers you specify must use static IP addresses, even if you use host names.</blockquote><p>This means if you add a hostname to the "Trusted Host" list and the IP behind the hostname changes, trusted authentication will stop working. Tableau Server is essentially hardcoding the IP of the host.</p><p>Therefore, <u>best practice</u> is to add IP addresses rather than host names to the Tableau Server "Trusted Host" list.</p><h1 id="next-steps-">Next Steps:</h1><ol><li><a href="https://www.zuar.com/help/waf/testing-trusted-authentication/">Test Trusted Authentication</a> in your Zuar Portal</li></ol><h2 id="related-tableau-trusted-authentication-content">Related Tableau Trusted Authentication Content</h2><!--kg-card-begin: bookmark--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.zuar.com/blog/trusted-ticket-authentication-with-tableau-server/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Trusted Ticket Authentication with Tableau Server | Zuar</div><div class="kg-bookmark-description">This article describes how Tableau trusted authentication provides Single Sign-On (SSO) for embedded analytics in third-party applications.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.zuar.com/blog/favicon.ico"><span class="kg-bookmark-author">Matthew R Laue</span><span class="kg-bookmark-publisher">Zuar | Blog</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.zuar.com/blog/content/images/2020/04/trusted-tickets.jpg"></div></a></figure><!--kg-card-end: bookmark--><!--kg-card-begin: bookmark--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.zuar.com/blog/implementing-trusted-tickets-for-tableau-server-with-nodejs/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Implementing Trusted Tickets for Tableau Server with NodeJS</div><div class="kg-bookmark-description">This article implements trusted tickets as described in Trusted Ticket
Authentication with Tableau Server
[https://www.zuar.com/blog/trusted-ticket-authentication-with-tableau-server/]. We’ll build a ticket broker with a simple API called by a front-end that uses
the HTML5 &amp;lt;template&amp;gt; tag. The int…</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.zuar.com/blog/favicon.ico"><span class="kg-bookmark-author">Matthew R Laue</span><span class="kg-bookmark-publisher">Zuar | Blog</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.zuar.com/blog/content/images/2020/04/trusted-tickets-node.jpg"></div></a></figure><!--kg-card-end: bookmark-->]]></content:encoded></item><item><title><![CDATA[Basic Authentication]]></title><description><![CDATA[<p>Users can be added to the Zuar WAF and authenticate to a Zuar Portal with <a href="https://en.wikipedia.org/wiki/Basic_access_authentication">basic authentication</a> (username and password).</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://www.zuar.com/help/waf/content/images/2020/09/image.png" class="kg-image"></figure><!--kg-card-end: image--><h2 id="alternate-authentication-options">Alternate Authentication Options</h2><ul><li><a href="https://www.zuar.com/help/waf/tableau-authentication/">Tableau Authentication</a></li><li><a href="https://www.zuar.com/help/waf/okta/">Okta Authentication</a></li></ul>]]></description><link>https://www.zuar.com/help/waf/basic-authentication/</link><guid isPermaLink="false">5f527383b92e4500016f04c6</guid><category><![CDATA[Authentication]]></category><dc:creator><![CDATA[Justin Freels]]></dc:creator><pubDate>Fri, 04 Sep 2020 17:05:16 GMT</pubDate><content:encoded><![CDATA[<p>Users can be added to the Zuar WAF and authenticate to a Zuar Portal with <a href="https://en.wikipedia.org/wiki/Basic_access_authentication">basic authentication</a> (username and password).</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://www.zuar.com/help/waf/content/images/2020/09/image.png" class="kg-image"></figure><!--kg-card-end: image--><h2 id="alternate-authentication-options">Alternate Authentication Options</h2><ul><li><a href="https://www.zuar.com/help/waf/tableau-authentication/">Tableau Authentication</a></li><li><a href="https://www.zuar.com/help/waf/okta/">Okta Authentication</a></li></ul>]]></content:encoded></item><item><title><![CDATA[Docker]]></title><description><![CDATA[<p>Zuar WAF microservices run in <a href="https://www.docker.com/">Docker</a> containers.</p><blockquote>Docker provides the ability to package and run an application in a loosely isolated environment called a container.</blockquote><p>They are orchestrated through <a href="https://docs.docker.com/compose/">Docker Compose</a>. </p><blockquote>Compose is a tool for defining and running multi-container Docker applications.</blockquote><h2 id="configuring-docker">Configuring Docker</h2><p>All of the Docker Compose configuration</p>]]></description><link>https://www.zuar.com/help/waf/docker/</link><guid isPermaLink="false">5f6dffa9b92e4500016f0513</guid><category><![CDATA[Administration]]></category><dc:creator><![CDATA[Andy Klier]]></dc:creator><pubDate>Fri, 25 Sep 2020 17:52:06 GMT</pubDate><content:encoded><![CDATA[<p>Zuar WAF microservices run in <a href="https://www.docker.com/">Docker</a> containers.</p><blockquote>Docker provides the ability to package and run an application in a loosely isolated environment called a container.</blockquote><p>They are orchestrated through <a href="https://docs.docker.com/compose/">Docker Compose</a>. </p><blockquote>Compose is a tool for defining and running multi-container Docker applications.</blockquote><h2 id="configuring-docker">Configuring Docker</h2><p>All of the Docker Compose configuration (services, networks, etc) is handle via a <code>docker-compose.yaml</code> file.</p><p>The default location for the <code>docker-compose.yaml</code> configuration file is the home directory for the user running Docker (e.g. <code>/home/ubuntu/docker-compose.yaml</code>).</p><p>Learn more about <a href="https://docs.docker.com/compose/">docker-compose</a>.</p><h2 id="starting-and-stopping-docker">Starting and Stopping Docker</h2><p>Zuar WAF microservices can be individually or collectively started and stopped with Docker Compose:</p><ul><li>Stop the Docker containers with <code>docker-compose down</code>.</li><li>Start the Docker containers with <code>docker-compose up</code>.</li><li>Start the Docker containers in the background <code>docker-compose up -d</code>. <em>This is the standard way to run the Zuar WAF.</em></li></ul><p>Run these commands in the same directory as the <code>docker-compose.yaml</code> (e.g. <code>/home/ubuntu/</code>).</p><p>Learn more about <a href="https://docs.docker.com/compose/reference/down/">docker-compose down</a> and <a href="https://docs.docker.com/compose/reference/up/">docker-compose up</a>.</p><h2 id="viewing-docker-logs">Viewing Docker Logs</h2><p>The logs for the Zuar WAF microservices can be viewed through Docker:</p><ul><li>View all logs for a container running in the background with <code>docker-compose logs -f</code>.</li><li>View the last 100 lines of the logs with <code>docker-compose logs -f --tail=100</code>.</li><li>View the <code>auth</code> container's logs with <code>docker-compose logs -f auth</code>.</li></ul><p>Learn more about <a href="https://docs.docker.com/engine/reference/commandline/logs/">Docker logs</a> and <a href="https://docs.docker.com/compose/reference/logs/">docker-compose logs</a>.</p>]]></content:encoded></item><item><title><![CDATA[Environment Variables]]></title><description><![CDATA[<p>Each Zuar WAF stores an environment variables file (env) that stores configuration and sensitive information as per <a href="https://12factor.net/config">12factor</a> methodology.</p><p>The env file is normally located in the home directory of the user running <a href="https://www.zuar.com/help/waf/docker/">Docker</a>. Example: <code>/home/&lt;user&gt;/.env</code> . Any changes to this file will require restarting Docker with:</p>]]></description><link>https://www.zuar.com/help/waf/env/</link><guid isPermaLink="false">5f6e2e59b92e4500016f0552</guid><category><![CDATA[Administration]]></category><dc:creator><![CDATA[Andy Klier]]></dc:creator><pubDate>Fri, 25 Sep 2020 17:52:47 GMT</pubDate><content:encoded><![CDATA[<p>Each Zuar WAF stores an environment variables file (env) that stores configuration and sensitive information as per <a href="https://12factor.net/config">12factor</a> methodology.</p><p>The env file is normally located in the home directory of the user running <a href="https://www.zuar.com/help/waf/docker/">Docker</a>. Example: <code>/home/&lt;user&gt;/.env</code> . Any changes to this file will require restarting Docker with:</p><!--kg-card-begin: markdown--><pre><code>docker-compose down
docker-compose up -d
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><style type="text/css">
.tg  {border-collapse:collapse;border-spacing:0;}
.tg td{border-color:black;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;
  overflow:hidden;padding:10px 5px;word-break:normal;}
.tg th{border-color:black;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;
  font-weight:normal;overflow:hidden;padding:10px 5px;word-break:normal;}
.tg .tg-0pky{border-color:inherit;text-align:left;vertical-align:top}
</style>
<table class="tg">
<thead>
  <tr>
    <th class="tg-0pky">Variable</th>
    <th class="tg-0pky">Value</th>
  </tr>
</thead>
<tbody>
  <tr>
    <td class="tg-0pky">DEBUG</td>
    <td class="tg-0pky">true|false</td>
  </tr>
  <tr>
    <td class="tg-0pky">SECRET<br></td>
    <td class="tg-0pky">&lt;secret&gt;</td>
  </tr>
  <tr>
    <td class="tg-0pky">DATABASE_URL</td>
    <td class="tg-0pky">postgres://&lt;username&gt;:&lt;password&gt;@&lt;database&gt;/&lt;DB name&gt;</td>
  </tr>
  <tr>
    <td class="tg-0pky">POSTGRES_DB</td>
    <td class="tg-0pky">&lt;DB name&gt;</td>
  </tr>
  <tr>
    <td class="tg-0pky">POSTGRES_USER</td>
    <td class="tg-0pky">&lt;username&gt;</td>
  </tr>
  <tr>
    <td class="tg-0pky">POSTGRES_PASSWORD</td>
    <td class="tg-0pky">&lt;password&gt;</td>
  </tr>
  <tr>
    <td class="tg-0pky">TABLEAU_SERVER_URL</td>
    <td class="tg-0pky">&lt;server_url e.g. https://tableau.yourdomain.com or https://us-east-1.online.tableau.com&gt;</td>
  </tr>
  <tr>
    <td class="tg-0pky">TABLEAU_SERVER_SITE</td>
    <td class="tg-0pky">&lt;site name&gt;</td>
  </tr>
  <tr>
    <td class="tg-0pky">TABLEAU_SERVER_USERNAME</td>
    <td class="tg-0pky">&lt;username&gt;</td>
  </tr>
  <tr>
    <td class="tg-0pky">TABLEAU_SERVER_PASSWORD</td>
    <td class="tg-0pky">&lt;password&gt;</td>
  </tr>
  <tr>
    <td class="tg-0pky">TABLEAU_DATABASE_URL</td>
    <td class="tg-0pky">postgres://&lt;username&gt;:&lt;password&gt;@&lt;database&gt;/&lt;DB name&gt;</td>
  </tr>
    <!--
  <tr>
    <td class="tg-0pky">LOGIN_TEMPLATE</td>
    <td class="tg-0pky">/app/static/login.mako</td>
  </tr>
-->
  <tr>
    <td class="tg-0pky">TOKEN_EXPIRY</td>
    <td class="tg-0pky">7200</td>
  </tr>
  <tr>
    <td class="tg-0pky">PORTAL_ADMIN_USERNAME</td>
    <td class="tg-0pky">&lt;username&gt;</td>
  </tr>
  <tr>
    <td class="tg-0pky">PORTAL_ADMIN_PASSWORD</td>
    <td class="tg-0pky">&lt;password&gt;</td>
  </tr>
  <tr>
    <td class="tg-0pky"></td>
    <td class="tg-0pky"></td>
  </tr>
</tbody>
</table><!--kg-card-end: html--><h2 id="environment-variables">Environment Variables</h2><h3 id="general">General</h3><ul><li>DEBUG</li><li>SECRET</li><li>TOKEN_EXPIRY</li></ul><h3 id="database">Database</h3><ul><li>DATABASE_URL</li><li>POSTGRES_USER</li><li>POSTGRES_PASSWORD</li><li>TARGET_DATABASE_URL</li></ul><h3 id="tableau">Tableau</h3><ul><li>TABLEAU_SERVER_URL</li><li>TABLEAU_SERVER_SITE</li><li>TABLEAU_SERVER_USERNAME</li><li>TABLEAU_SERVER_PASSWORD</li></ul><p>Related Tableau documentation:</p><ul><li><a href="https://www.zuar.com/help/waf/tableau-authentication/">Tableau Authentication</a></li><li><a href="https://www.zuar.com/help/waf/trusted-host-for-tableau-server-trusted-authentication/">Tableau Trusted Authentication</a></li></ul><h3 id="okta">Okta</h3><ul><li>OKTA_APP_EMBED_LINK</li><li>OKTA_TOKEN</li></ul><p>Related <a href="https://www.zuar.com/help/waf/okta/">Okta documentation</a>.</p><h3 id="salesforce">Salesforce</h3><ul><li>SECRET</li><li>SIGNED_REQUEST_USERNAME</li></ul><p>Related <a href="https://www.zuar.com/help/waf/salesforce-connected-app/">Salesforce documentation</a>.</p>]]></content:encoded></item><item><title><![CDATA[Nginx]]></title><description><![CDATA[<p>Zuar WAF uses <a href="https://nginx.org/en/">Nginx</a> as a web server and proxy server. Nginx runs inside <a href="https://www.zuar.com/help/waf/docker/">Docker</a> in the <strong>zwaf</strong> microservice.</p><h2 id="configuring-nginx">Configuring Nginx</h2><p>Nginx configuration files are located in the home directory of the user running <a href="https://www.zuar.com/help/waf/docker/">Docker</a>:</p><ul><li>The main Nginx directory is located at <code>/home/{user}/app/nginx</code>. </li><li>Individual Nginx configuration files</li></ul>]]></description><link>https://www.zuar.com/help/waf/nginx/</link><guid isPermaLink="false">5f6e3a3cb92e4500016f055a</guid><category><![CDATA[Administration]]></category><dc:creator><![CDATA[Andy Klier]]></dc:creator><pubDate>Fri, 25 Sep 2020 18:51:38 GMT</pubDate><content:encoded><![CDATA[<p>Zuar WAF uses <a href="https://nginx.org/en/">Nginx</a> as a web server and proxy server. Nginx runs inside <a href="https://www.zuar.com/help/waf/docker/">Docker</a> in the <strong>zwaf</strong> microservice.</p><h2 id="configuring-nginx">Configuring Nginx</h2><p>Nginx configuration files are located in the home directory of the user running <a href="https://www.zuar.com/help/waf/docker/">Docker</a>:</p><ul><li>The main Nginx directory is located at <code>/home/{user}/app/nginx</code>. </li><li>Individual Nginx configuration files are located at <code>/home/{user}/app/nginx/conf.d/</code>.</li></ul><p>Learn more about <a href="http://nginx.org/en/docs/beginners_guide.html">configuring Nginx</a>.</p><h2 id="restarting-nginx">Restarting Nginx</h2><p>Any changes made to the Nginx configuration files require restarting Nginx.</p><p>Restart Nginx through Docker with <code>docker exec zwaf nginx -s reload</code>.</p>]]></content:encoded></item><item><title><![CDATA[DNS Resolution]]></title><description><![CDATA[<p>By default the WAF uses the internal resolver of the docker container <code>127.0.0.11</code> for DNS name resolution. This is set in the Nginx conf file (typically located at: <code>/home/&lt;user&gt;/app/nginx/conf.d/default.conf</code>).</p><!--kg-card-begin: markdown--><pre><code>server {
    listen 443 ssl;

    server_name  _;
    root /app/static/</code></pre>]]></description><link>https://www.zuar.com/help/waf/dns-resolution/</link><guid isPermaLink="false">5f870dcf10562e0001d723f4</guid><category><![CDATA[Administration]]></category><dc:creator><![CDATA[Andy Klier]]></dc:creator><pubDate>Wed, 14 Oct 2020 15:09:26 GMT</pubDate><content:encoded><![CDATA[<p>By default the WAF uses the internal resolver of the docker container <code>127.0.0.11</code> for DNS name resolution. This is set in the Nginx conf file (typically located at: <code>/home/&lt;user&gt;/app/nginx/conf.d/default.conf</code>).</p><!--kg-card-begin: markdown--><pre><code>server {
    listen 443 ssl;

    server_name  _;
    root /app/static/;
    resolver 127.0.0.11;
</code></pre>
<!--kg-card-end: markdown--><p>To change the name server you can edit the <code>resolver 127.0.0.11</code> line to any name server you want (Ex: an internal DNS server like <code>8.8.8.8</code>). Any changes to this file will require restarting Nginx with <code>docker exec zwaf nginx -s reload</code></p><p><a href="http://nginx.org/en/docs/http/ngx_http_core_module.html#resolver">Learn more about setting the DNS resolver using Nginx.</a></p><h3 id="dns-resolution-via-docker">DNS Resolution via Docker</h3><p>It is possible to add name servers in addition to the existing name server defined in Nginx, via updating the docker-compose YAML file (usually located at: <code>/home/&lt;user&gt;/docker-compose.yaml</code>). To accomplish this, add an <code>extra_hosts</code> block to the <code>zwaf</code> container. Example:</p><!--kg-card-begin: markdown--><pre><code>zwaf:
    ...
    extra_hosts:
      - &quot;somehost:162.242.195.82&quot;
      - &quot;otherhost:50.31.209.229&quot;
</code></pre>
<!--kg-card-end: markdown--><p>Any changes made to <code>docker-compose.yaml</code> will require restarting Docker with <code>docker-compose down &amp;&amp; docker-compose up -d</code>.</p><p><a href="https://docs.docker.com/compose/compose-file/compose-file-v3/#extra_hosts">Learn more about adding name servers using Docker.</a></p>]]></content:encoded></item><item><title><![CDATA[SSL]]></title><description><![CDATA[<p>The Zuar WAF requires valid SSL certificates.</p><p>Users can install their own SSL certificates or have Zuar manage the SSL certificates via <a href="https://letsencrypt.org/">LetsEncrypt</a>.</p><h2 id="ssl-certificates-for-portals">SSL Certificates for Portals</h2><p><a href="https://www.zuar.com/help/rapid-portal/">Rapid Portal</a> and <a href="https://www.zuar.com/help/custom-portal/">Custom Portal</a> are deployed with <a href="https://www.zuar.com/help/waf/docker/">Docker</a>.</p><p>The SSL certificates are mapped into the <code>zwaf</code> microservice. This file mapping is configured</p>]]></description><link>https://www.zuar.com/help/waf/ssl/</link><guid isPermaLink="false">6009ce38348a9300011e59f3</guid><category><![CDATA[Administration]]></category><dc:creator><![CDATA[Justin Freels]]></dc:creator><pubDate>Thu, 21 Jan 2021 18:56:28 GMT</pubDate><content:encoded><![CDATA[<p>The Zuar WAF requires valid SSL certificates.</p><p>Users can install their own SSL certificates or have Zuar manage the SSL certificates via <a href="https://letsencrypt.org/">LetsEncrypt</a>.</p><h2 id="ssl-certificates-for-portals">SSL Certificates for Portals</h2><p><a href="https://www.zuar.com/help/rapid-portal/">Rapid Portal</a> and <a href="https://www.zuar.com/help/custom-portal/">Custom Portal</a> are deployed with <a href="https://www.zuar.com/help/waf/docker/">Docker</a>.</p><p>The SSL certificates are mapped into the <code>zwaf</code> microservice. This file mapping is configured in <code>docker-compose.yaml</code>:</p><!--kg-card-begin: code--><pre><code class="language-yaml">zwaf:
    ...
    volumes:
      ...
      - ./server.key:/etc/ssl/private/server.key
      - ./server.crt:/etc/ssl/certs/server.crt
      ...
    ...</code></pre><!--kg-card-end: code--><p>In the example above, the SSL certs are composed of two files:</p><ul><li><strong>server.key </strong>- This SSL key file is located in the same directory as <code>docker-compose.yaml</code> and is mapped into the <code>zwaf</code> container at <code>/etc/ssl/private/server.key</code></li><li><strong>server.crt</strong> - This SSL crt file is located in the same directory as <code>docker-compose.yaml</code> and is mapped into the <code>zwaf</code> container at <code>/etc/ssl/certs/server.crt</code></li></ul><p>Any updates to the <code>docker-compose.yaml</code> require a restart of the Docker containers.</p><!--kg-card-begin: bookmark--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.zuar.com/help/waf/docker/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Docker</div><div class="kg-bookmark-description">Zuar WAF microservices run in Docker [https://www.docker.com/] containers. &amp;gt; Docker provides the ability to package and run an application in a loosely
isolated environment called a container.
They are orchestrated through Docker Compose [https://docs.docker.com/compose/…</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.zuar.com/help/waf/favicon.ico"><span class="kg-bookmark-author">Andy Klier</span><span class="kg-bookmark-publisher">Zuar Web Application Firewall</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.zuar.com/help/waf/content/images/2020/03/zuar-gradient.png"></div></a></figure><!--kg-card-end: bookmark-->]]></content:encoded></item><item><title><![CDATA[User Management]]></title><description><![CDATA[<p>Once logged in as an admin, you can manage users using the WAF's <a href="https://www.zuar.com/help/waf/auth-api/">Authentication API</a> located at <code>https://&lt;your-hostname&gt;/auth/users</code>.</p><p>Navigating to this endpoint in your browser as an admin will show you a list of users.</p><h2 id="create-user">Create User</h2><!--kg-card-begin: image--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.zuar.com/help/waf/content/images/2021/02/Screen-Shot-2021-02-02-at-8.27.58-AM.png" class="kg-image" alt="Create user swagger endpoint"><figcaption>Create user swagger endpoint</figcaption></figure><!--kg-card-end: image--><p>The create user POST</p>]]></description><link>https://www.zuar.com/help/waf/user-management/</link><guid isPermaLink="false">6018544c348a9300011e5a13</guid><category><![CDATA[Administration]]></category><dc:creator><![CDATA[Andy Klier]]></dc:creator><pubDate>Tue, 02 Feb 2021 16:18:50 GMT</pubDate><content:encoded><![CDATA[<p>Once logged in as an admin, you can manage users using the WAF's <a href="https://www.zuar.com/help/waf/auth-api/">Authentication API</a> located at <code>https://&lt;your-hostname&gt;/auth/users</code>.</p><p>Navigating to this endpoint in your browser as an admin will show you a list of users.</p><h2 id="create-user">Create User</h2><!--kg-card-begin: image--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.zuar.com/help/waf/content/images/2021/02/Screen-Shot-2021-02-02-at-8.27.58-AM.png" class="kg-image" alt="Create user swagger endpoint"><figcaption>Create user swagger endpoint</figcaption></figure><!--kg-card-end: image--><p>The create user POST endpoint takes a request object like:</p><!--kg-card-begin: markdown--><pre><code class="language-json">{
  &quot;username&quot;: &quot;string&quot;,
  &quot;fullname&quot;: &quot;string&quot;,
  &quot;password&quot;: &quot;string&quot;,
  &quot;email&quot;: &quot;string&quot;,
  &quot;admin&quot;: false
}
</code></pre>
<!--kg-card-end: markdown--><p>With the swagger endpoint selected, click the <code>Try it out</code> button on the right at the top of the section.</p><p>Edit the request object to include the information for the new user, then click <code>Execute</code> to create the user.</p><p>Note that creating a user via the authentication API creates a local Portal user. See <a href="https://www.zuar.com/help/waf/basic-authentication/">basic authentication</a> for more information.</p><h2 id="list-all-users">List All Users</h2><!--kg-card-begin: image--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.zuar.com/help/waf/content/images/2021/02/Screen-Shot-2021-02-02-at-8.59.21-AM.png" class="kg-image" alt="List all users swagger endpoint"><figcaption>List all users swagger endpoint</figcaption></figure><!--kg-card-end: image--><p>As mentioned above you can load this endpoint (<code>https://&lt;your-hostname&gt;/auth/users</code>) in your browser. Alternatively you can try the endpoint using the swagger docs. With the swagger endpoint selected click <code>Try it out</code>, then click <code>Execute</code></p><h2 id="edit-update-user">Edit/Update User</h2><!--kg-card-begin: image--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.zuar.com/help/waf/content/images/2021/02/Screen-Shot-2021-02-02-at-9.03.21-AM.png" class="kg-image" alt="Update user swagger endpoint"><figcaption>Update user swagger endpoint</figcaption></figure><!--kg-card-end: image--><p>To edit an existing user, you will first need to get the user's <code>id</code> from the <code>/auth/users</code> endpoint.</p><p>In addition to the user's <code>id</code>, the update endpoint expects the following request object:</p><!--kg-card-begin: markdown--><pre><code class="language-json">{
  &quot;username&quot;: &quot;string&quot;,
  &quot;fullname&quot;: &quot;string&quot;,
  &quot;password&quot;: &quot;string&quot;,
  &quot;email&quot;: &quot;string&quot;,
  &quot;admin&quot;: false
}
</code></pre>
<!--kg-card-end: markdown--><p>With the endpoint selected, click <code>Try it out</code> then enter the user's <code>id</code>. Edit the request object with the updated user's information and click <code>Execute</code>.</p><h3 id="promoting-a-user-to-admin">Promoting a User to Admin</h3><p>Use the <code>/auth/users</code> endpoint with a GET request to find the specific user's <code>id</code>.</p><p>Use the <code>/auth/users/{user_id}</code> endpoint with a PUT request and the specific user's <code>id</code> and the following request object:</p><!--kg-card-begin: code--><pre><code class="language-JSON">{
  "admin": true
}</code></pre><!--kg-card-end: code--><h2 id="delete-user">Delete User</h2><!--kg-card-begin: image--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.zuar.com/help/waf/content/images/2021/02/Screen-Shot-2021-02-02-at-9.09.55-AM.png" class="kg-image" alt="Delete user swagger endpoint"><figcaption>Delete user swagger endpoint</figcaption></figure><!--kg-card-end: image--><p>To delete an existing user, you will first need to get the user's <code>id</code> from the <code>/auth/users</code> endpoint.</p><p>With the delete endpoint selected, click <code>Try it out</code> and enter the user's <code>id</code>. Clicking <code>Execute</code> will delete the user. You will not get a confirm dialogue.</p>]]></content:encoded></item><item><title><![CDATA[Auth API]]></title><description><![CDATA[<p>The WAF's Auth API handles all authentication and authorization requests (e.g. login, logout, users, etc).</p><h2 id="base-url">Base URL</h2><p><code>https://{waf_url}/auth</code></p><h2 id="authentication"><strong>Authentication</strong></h2><p>The Auth API uses basic authentication for access. See <code>/auth/login</code> endpoint in <a href="https://swagger.io/">Swagger</a> for more information.</p><h2 id="authorization">Authorization</h2><p>Only admin users have access to the Auth APIs.</p>]]></description><link>https://www.zuar.com/help/waf/auth-api/</link><guid isPermaLink="false">6019c0f7348a9300011e5ae4</guid><category><![CDATA[API]]></category><dc:creator><![CDATA[Justin Freels]]></dc:creator><pubDate>Tue, 02 Feb 2021 21:15:45 GMT</pubDate><content:encoded><![CDATA[<p>The WAF's Auth API handles all authentication and authorization requests (e.g. login, logout, users, etc).</p><h2 id="base-url">Base URL</h2><p><code>https://{waf_url}/auth</code></p><h2 id="authentication"><strong>Authentication</strong></h2><p>The Auth API uses basic authentication for access. See <code>/auth/login</code> endpoint in <a href="https://swagger.io/">Swagger</a> for more information.</p><h2 id="authorization">Authorization</h2><p>Only admin users have access to the Auth APIs.</p><h2 id="endpoints-and-methods"><strong>Endpoints and Methods</strong></h2><p>The Auth API has <a href="https://swagger.io/">Swagger</a> documentation at <code>/auth/docs</code>. You can see all the API endpoints and test them using the Swagger UI.</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://www.zuar.com/help/waf/content/images/2021/02/image.png" class="kg-image"></figure><!--kg-card-end: image--><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://www.zuar.com/help/waf/content/images/2021/02/image-1.png" class="kg-image"></figure><!--kg-card-end: image--><h2 id="responses">Responses</h2><p>The Auth API returns data in JSON format.</p><p><br></p>]]></content:encoded></item><item><title><![CDATA[Testing Salesforce Connected App]]></title><description><![CDATA[<h2 id="testing-your-zuar-portal-salesforce-connected-app-with-canvas-app-previewer">Testing Your Zuar Portal Salesforce Connected App With Canvas App Previewer</h2><p></p><p><em>Do this step after Zuar has configured your Portal to integrate with Salesforce.</em></p><p>In Salesforce, search for <strong>'Canvas App Previewer'</strong> in the Quick Find search bar.</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://www.zuar.com/help/waf/content/images/2020/07/image-1.png" class="kg-image"></figure><!--kg-card-end: image--><p>Click on the newly created Canvas App.</p><p>You should see a big JSON</p>]]></description><link>https://www.zuar.com/help/waf/testing-salesforce-connected-app/</link><guid isPermaLink="false">5f527185b92e4500016f04a7</guid><category><![CDATA[Salesforce Integration]]></category><dc:creator><![CDATA[Justin Freels]]></dc:creator><pubDate>Fri, 04 Sep 2020 16:56:19 GMT</pubDate><content:encoded><![CDATA[<h2 id="testing-your-zuar-portal-salesforce-connected-app-with-canvas-app-previewer">Testing Your Zuar Portal Salesforce Connected App With Canvas App Previewer</h2><p></p><p><em>Do this step after Zuar has configured your Portal to integrate with Salesforce.</em></p><p>In Salesforce, search for <strong>'Canvas App Previewer'</strong> in the Quick Find search bar.</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://www.zuar.com/help/waf/content/images/2020/07/image-1.png" class="kg-image"></figure><!--kg-card-end: image--><p>Click on the newly created Canvas App.</p><p>You should see a big JSON object response if the app is configured properly both in Salesforce and on the Zuar Portal side.</p><p>Learn more about <a href="https://help.salesforce.com/s/articleView?id=sf.canvas_app_previewer.htm&amp;type=5">Salesforce's Canvas App Previewer</a>.</p>]]></content:encoded></item><item><title><![CDATA[Testing Trusted Authentication]]></title><description><![CDATA[<h2 id="test-trusted-authentication-in-zuar-portal">Test Trusted Authentication in Zuar Portal</h2><p>Log into your Zuar Portal and navigate to <code>https://{your_rapid_portal_url}/z/trusted</code>.</p><p>If you are not <a href="https://www.zuar.com/help/waf/tableau-authentication/">authenticated via Tableau</a>, you'll get a <strong>403 Forbidden</strong> error.</p><p>If trusted authentication is properly configured, you should see a one time use ticket as an</p>]]></description><link>https://www.zuar.com/help/waf/testing-trusted-authentication/</link><guid isPermaLink="false">5f5272bbb92e4500016f04b6</guid><category><![CDATA[Tableau Integration]]></category><dc:creator><![CDATA[Justin Freels]]></dc:creator><pubDate>Fri, 04 Sep 2020 17:01:54 GMT</pubDate><content:encoded><![CDATA[<h2 id="test-trusted-authentication-in-zuar-portal">Test Trusted Authentication in Zuar Portal</h2><p>Log into your Zuar Portal and navigate to <code>https://{your_rapid_portal_url}/z/trusted</code>.</p><p>If you are not <a href="https://www.zuar.com/help/waf/tableau-authentication/">authenticated via Tableau</a>, you'll get a <strong>403 Forbidden</strong> error.</p><p>If trusted authentication is properly configured, you should see a one time use ticket as an alphanumeric string (e.g. <code>5NB0HLyVQ7mD61q2phD5Lg==:FMi5vVV4kxGmmf7Rh86_gX66</code>).</p><p>If trusted authentication is <strong>NOT</strong> properly configured, you should will see <code>-1</code>.</p><p>Read  more Tableau Server documentation: <a href="https://help.tableau.com/current/server/en-us/trusted_auth_trouble_1return.htm">Ticket Value of -1 Returned from Tableau Server</a></p>]]></content:encoded></item></channel></rss>