# How to read http\_userid's Base64 encoded userid from Ruby?

**URL:** <https://www.ruby-forum.com/t/how-to-read-http-userids-base64-encoded-userid-from-ruby/183170>\
**Category:** NGINX\
**Created:** [February 9, 2010, 1:21pm UTC](https://www.ruby-forum.com/t/how-to-read-http-userids-base64-encoded-userid-from-ruby/183170 "2010-02-09T13:21:32Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![Sven\_CSKoehler](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/3be4f8/32.png) [@Sven\_CSKoehler](https://www.ruby-forum.com/u/Sven_CSKoehler)\
**Post date:** [February 9, 2010, 1:21pm UTC](https://www.ruby-forum.com/t/how-to-read-http-userids-base64-encoded-userid-from-ruby/183170/1 "2010-02-09T13:21:32Z")

</div>

Hey,

I am using the http user id module and have not yet figured out how I  
can  
read the base64 encoded cookie from Ruby. It seems like nginx uses a  
different form of base64 than Ruby does…

Example:  
| uid value = E2F32BD0F154704B0C176D1D02050303

In Ruby I see the cookie encoded like this:

| {“uid”=\>“0Cvz4ktwVPEdbRcMAwMFAg==”}  
When I try to decode this value with Base64 in Ruby I get:

| require “base64”  
| enc=“0Cvz4ktwVPEdbRcMAwMFAg==”  
| =\> “0Cvz4ktwVPEdbRcMAwMFAg==”  
| Base64.decode64(enc)  
| =\> “\320+\363\342KpT\361\035m\027\f\003\003\005\002”

Has anyone an idea about what I am doing wrong here?

-S.

[nginx.conf entries regarding http userid]  
| userid on;  
| userid\_name uid;  
| userid\_domain [foo.com](http://foo.com);  
| userid\_path /;  
| userid\_expires 720d;  
| userid\_p3p ‘policyref=“/w3c/p3p.xml”, CP=“ADMa DEVa PSAa PSDa OUR IND DSP NON COR”’;

---

<div class="post-metadata">

**Author:** ![Sven\_CSKoehler](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/3be4f8/32.png) [@Sven\_CSKoehler](https://www.ruby-forum.com/u/Sven_CSKoehler)\
**Post date:** [February 9, 2010, 3:50pm UTC](https://www.ruby-forum.com/t/how-to-read-http-userids-base64-encoded-userid-from-ruby/183170/2 "2010-02-09T15:50:49Z")

</div>

On Tue, Feb 9, 2010 at 1:20 PM, Sven C. Koehler [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> | {“uid”=\>“0Cvz4ktwVPEdbRcMAwMFAg==”}  
> When I try to decode this value with Base64 in Ruby I get:

Hi, Don’t know the details, but the E2F3… thing is not base64. It  
looks  
more like hex encoding (should read as E2 F3 2B).. see ruby’s  
String#unpack  
to munge it.

---

<div class="post-metadata">

**Author:** ![Sven\_CSKoehler](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/3be4f8/32.png) [@Sven\_CSKoehler](https://www.ruby-forum.com/u/Sven_CSKoehler)\
**Post date:** [February 9, 2010, 4:54pm UTC](https://www.ruby-forum.com/t/how-to-read-http-userids-base64-encoded-userid-from-ruby/183170/3 "2010-02-09T16:54:03Z")

</div>

Ok, I’ve found a way to get to the original value, seems like nginx uses  
a different byte order than ruby does…

> cookie\_uid = “0Cvz4ktwVPEdbRcMAwMFAg==”; cc = cookie\_uid.unpack(‘m\*’).first; rr = cc.split(“”).map{|c| c[0].to\_i}.inject() {|v,s| v.push sprintf(“%02X”, s); v; }.values\_at(3, 2, 1, 0, 7, 6, 5, 4, 11, 10, 9, 8, 15, 14, 13, 12).join(“”)  
> =\> “E2F32BD0F154704B0C176D1D02050303”

(One could probably write this more elegantly by using the right flags  
for  
unpack.)

-S.

---

<div class="post-metadata">

**Author:** ![Sven\_CSKoehler](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/3be4f8/32.png) [@Sven\_CSKoehler](https://www.ruby-forum.com/u/Sven_CSKoehler)\
**Post date:** [September 9, 2011, 9:29pm UTC](https://www.ruby-forum.com/t/how-to-read-http-userids-base64-encoded-userid-from-ruby/183170/4 "2011-09-09T21:29:20Z")

</div>

Hello Sven,  
I came across the same problem. But the solution you  
mentioned does not work with my program. When I run this code  
cookie = CqCx7E5qMNUxrmAUAwMJAg==

cc = cookie.unpack(‘m\*’).first; rr = cc.split("").map{|c|  
c[0].to\_i}.inject([]) {|v,s| v.push sprintf("%02X", s); v;  
}.values\_at(3, 2, 1, 0, 7, 6, 5, 4, 11, 10, 9, 8, 15, 14, 13,  
12).join("")

I get back the result as “00000000000000000000000100000000” but actually  
it should be ECB1A00AD5306A4E1460AE3102090303

Do you know what am i doing wrong?
