<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>devise rails on random thoughts</title><link>https://awesomeprogrammer.com/categories/devise-rails/</link><description>Recent content in devise rails on random thoughts</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Tue, 26 May 2015 00:00:00 +0000</lastBuildDate><atom:link href="https://awesomeprogrammer.com/categories/devise-rails/index.xml" rel="self" type="application/rss+xml"/><item><title>Graceful unauthorized pdf redirect with devise (custom failure app)</title><link>https://awesomeprogrammer.com/blog/2015/05/26/graceful-unauthorized-pdf-redirect-with-devise-custom-failure-app/</link><pubDate>Tue, 26 May 2015 00:00:00 +0000</pubDate><guid>https://awesomeprogrammer.com/blog/2015/05/26/graceful-unauthorized-pdf-redirect-with-devise-custom-failure-app/</guid><description><![CDATA[<p>Let&rsquo;s say your users are trying to access some pdf files that you&rsquo;re serving inline with <a href="https://github.com/mileszs/wicked_pdf">wicked_pdf</a> or any other gem of you choice that is a wrapper for <code>wkhtmltopdf</code>. But they have to sign in first.</p>
<p>What happens when you use devise and you hit <em>pdf</em> url as unauthorized user? By default your app will respond with <code>401 Unauthorized</code> which will get converted into invalid pdf file and this kinda not what you want. Probably ;).</p>
<p>This can be fairly easy resolved with the help of custom <a href="https://github.com/plataformatec/devise/blob/master/lib/devise/failure_app.rb">failure_app</a>. Let the code speak for itself:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-ruby" data-lang="ruby"><span style="display:flex;"><span><span style="color:#75715e"># config/initializers/devise.rb</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># you should probably put this somewhere in lib/ ;-)</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">class</span> <span style="color:#a6e22e">MyFailureApp</span> <span style="color:#f92672">&lt;</span> <span style="color:#66d9ef">Devise</span><span style="color:#f92672">::</span><span style="color:#66d9ef">FailureApp</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">def</span> <span style="color:#a6e22e">respond</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># let&#39;s say we want to handle that pdf request nicely</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> request<span style="color:#f92672">.</span>format <span style="color:#f92672">==</span> <span style="color:#e6db74">:pdf</span>
</span></span><span style="display:flex;"><span>      pdf_redirect
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">else</span>
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">super</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">end</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">end</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">protected</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#75715e"># Assuming you have new_user_session_path in your routes</span>
</span></span><span style="display:flex;"><span>  <span style="color:#75715e"># Devise is doing much much more magic, see `scope_url`</span>
</span></span><span style="display:flex;"><span>  <span style="color:#75715e"># for more insight!</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">def</span> <span style="color:#a6e22e">pdf_redirect</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># after signing-in we want to redirect user back to requested pdf file</span>
</span></span><span style="display:flex;"><span>    session<span style="color:#f92672">[</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">#{</span>scope<span style="color:#e6db74">}</span><span style="color:#e6db74">_return_to&#34;</span><span style="color:#f92672">]</span> <span style="color:#f92672">=</span> attempted_path <span style="color:#66d9ef">if</span> request<span style="color:#f92672">.</span>get?
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># nothing fancy here, i18n_message &amp; scope are provided by parent class</span>
</span></span><span style="display:flex;"><span>    redirect_to <span style="color:#e6db74">:&#34;new_</span><span style="color:#e6db74">#{</span>scope<span style="color:#e6db74">}</span><span style="color:#e6db74">_session&#34;</span>, format: <span style="color:#e6db74">:html</span>, <span style="color:#e6db74">alert</span>: i18n_message
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">end</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">end</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">Devise</span><span style="color:#f92672">.</span>setup <span style="color:#66d9ef">do</span> <span style="color:#f92672">|</span>config<span style="color:#f92672">|</span>
</span></span><span style="display:flex;"><span>  <span style="color:#75715e"># ...</span>
</span></span><span style="display:flex;"><span>  config<span style="color:#f92672">.</span>warden <span style="color:#66d9ef">do</span> <span style="color:#f92672">|</span>manager<span style="color:#f92672">|</span>
</span></span><span style="display:flex;"><span>    manager<span style="color:#f92672">.</span>failure_app <span style="color:#f92672">=</span> <span style="color:#66d9ef">MyFailureApp</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">end</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">end</span>
</span></span></code></pre></div><p>And that&rsquo;s the simple remedy for our pain ;-).</p>
<p>You can also try playing with <code>Devise.navigational_formats</code>, unfortunately I regret that I didn&rsquo;t wrote that blog-post few weeks ago, because I recall that I stumbled upon some issue while trying to solve it that way. I ended up with custom failure app after all, but right now I simply don&rsquo;t remember exact reasoning :P.</p>]]></description><content:encoded><![CDATA[<p>Let&rsquo;s say your users are trying to access some pdf files that you&rsquo;re serving inline with <a href="https://github.com/mileszs/wicked_pdf">wicked_pdf</a> or any other gem of you choice that is a wrapper for <code>wkhtmltopdf</code>. But they have to sign in first.</p>
<p>What happens when you use devise and you hit <em>pdf</em> url as unauthorized user? By default your app will respond with <code>401 Unauthorized</code> which will get converted into invalid pdf file and this kinda not what you want. Probably ;).</p>
<p>This can be fairly easy resolved with the help of custom <a href="https://github.com/plataformatec/devise/blob/master/lib/devise/failure_app.rb">failure_app</a>. Let the code speak for itself:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-ruby" data-lang="ruby"><span style="display:flex;"><span><span style="color:#75715e"># config/initializers/devise.rb</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># you should probably put this somewhere in lib/ ;-)</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">class</span> <span style="color:#a6e22e">MyFailureApp</span> <span style="color:#f92672">&lt;</span> <span style="color:#66d9ef">Devise</span><span style="color:#f92672">::</span><span style="color:#66d9ef">FailureApp</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">def</span> <span style="color:#a6e22e">respond</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># let&#39;s say we want to handle that pdf request nicely</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> request<span style="color:#f92672">.</span>format <span style="color:#f92672">==</span> <span style="color:#e6db74">:pdf</span>
</span></span><span style="display:flex;"><span>      pdf_redirect
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">else</span>
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">super</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">end</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">end</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">protected</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#75715e"># Assuming you have new_user_session_path in your routes</span>
</span></span><span style="display:flex;"><span>  <span style="color:#75715e"># Devise is doing much much more magic, see `scope_url`</span>
</span></span><span style="display:flex;"><span>  <span style="color:#75715e"># for more insight!</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">def</span> <span style="color:#a6e22e">pdf_redirect</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># after signing-in we want to redirect user back to requested pdf file</span>
</span></span><span style="display:flex;"><span>    session<span style="color:#f92672">[</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">#{</span>scope<span style="color:#e6db74">}</span><span style="color:#e6db74">_return_to&#34;</span><span style="color:#f92672">]</span> <span style="color:#f92672">=</span> attempted_path <span style="color:#66d9ef">if</span> request<span style="color:#f92672">.</span>get?
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># nothing fancy here, i18n_message &amp; scope are provided by parent class</span>
</span></span><span style="display:flex;"><span>    redirect_to <span style="color:#e6db74">:&#34;new_</span><span style="color:#e6db74">#{</span>scope<span style="color:#e6db74">}</span><span style="color:#e6db74">_session&#34;</span>, format: <span style="color:#e6db74">:html</span>, <span style="color:#e6db74">alert</span>: i18n_message
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">end</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">end</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">Devise</span><span style="color:#f92672">.</span>setup <span style="color:#66d9ef">do</span> <span style="color:#f92672">|</span>config<span style="color:#f92672">|</span>
</span></span><span style="display:flex;"><span>  <span style="color:#75715e"># ...</span>
</span></span><span style="display:flex;"><span>  config<span style="color:#f92672">.</span>warden <span style="color:#66d9ef">do</span> <span style="color:#f92672">|</span>manager<span style="color:#f92672">|</span>
</span></span><span style="display:flex;"><span>    manager<span style="color:#f92672">.</span>failure_app <span style="color:#f92672">=</span> <span style="color:#66d9ef">MyFailureApp</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">end</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">end</span>
</span></span></code></pre></div><p>And that&rsquo;s the simple remedy for our pain ;-).</p>
<p>You can also try playing with <code>Devise.navigational_formats</code>, unfortunately I regret that I didn&rsquo;t wrote that blog-post few weeks ago, because I recall that I stumbled upon some issue while trying to solve it that way. I ended up with custom failure app after all, but right now I simply don&rsquo;t remember exact reasoning :P.</p>]]></content:encoded></item></channel></rss>