ActiveResource & Authenticating with Emails

I’m trying to use a site called zendesk.com and you authenticate to the site using an email address and a password, so that the self.site definition in the model looks like this:

self.site = “http://the@email.com:thepassword@myplace.zendesk.com

The problem with this is, because we have the @ sign in our username, Ruby thinks this to be an invalid URL so throws a big hissy fit: URI::InvalidURIError: bad URI(is not URI?): from /usr/lib/ruby/1.8/uri/common.rb:436:in split' from /usr/lib/ruby/1.8/uri/common.rb:485:in parse’ from /usr/lib/ruby/gems/1.8/gems/activeresource-2.0.2/lib/active_resource/base.rb:477:in create_site_uri_from' from /usr/lib/ruby/gems/1.8/gems/activeresource-2.0.2/lib/active_resource/base.rb:167:in site=’ from /home/ryan/projects/site/app/models/user.rb:2 from /usr/lib/ruby/gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:203:in load_without_new_constant_marking' from /usr/lib/ruby/gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:203:in load_file’ from /usr/lib/ruby/gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:342:in new_constants_in' from /usr/lib/ruby/gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:202:in load_file’ from /usr/lib/ruby/gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:94:in require_or_load' from /usr/lib/ruby/gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:248:in load_missing_constant’ from /usr/lib/ruby/gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:453:in const_missing' from /usr/lib/ruby/gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:465:in const_missing’ from (irb):1

The command line curl has no such complaint however.

Suggestions?

I'm trying to use a site called zendesk.com and you authenticate to
the site using an email address and a password, so that the
self.site definition in the model looks like this:

self.site = "http://the@email.com:thepassword@myplace.zendesk.com"

The problem with this is, because we have the @ sign in our
username, Ruby thinks this to be an invalid URL so throws a big
hissy fit:

URL Encode the @ (%40) ?

Fred

Just as

self.site = “http://user%40site.com:password@myplace.zendesk.com

?

That returns a 401. I think it may be passing in the %40 as part of the username.

Even I am facing the same issue :frowning: Any help?

Thanks in advance.

Just as

self.site = "http://user%40site.com:password@myplace.zendesk.com"

Worth a go :slight_smile: Definitely works with some clients/libraries (and I
believe it what the rfcs say you should do)

That didn’t work. I already tried it before making my post.

That didn't work. I already tried it before making my post.

It appears that you can set site to either a string or an instance of
URI. If rails'/ruby's parsing of a url string is tripping up in this
case maybe the latter option is worth exploring?

Fred

As in URI.parse? That fails too, with an identical error.

As in URI.parse? That fails too, with an identical error.

No, I was thinking along the lings of some_uri = URI.parse('http://myplace.zendesk.com') some_uri.user = 'xxx' some_uri.password = 'zzz' self.site = some_uri

Fred

irb(main):005:0> uri.user = ‘my@email.com’ URI::InvalidComponentError: bad component(expected userinfo component or user component): daniel@email.com from c:/ruby/lib/ruby/1.8/uri/generic.rb:269:in check_user' from c:/ruby/lib/ruby/1.8/uri/generic.rb:311:in user=’ from (irb):5

irb(main):005:0> uri.user = 'my@email.com' URI::InvalidComponentError: bad component(expected userinfo
component or user component): daniel@email.com         from c:/ruby/lib/ruby/1.8/uri/generic.rb:269:in `check_user'         from c:/ruby/lib/ruby/1.8/uri/generic.rb:311:in `user='         from (irb):5

Beginning to look like you're walking down an unfrequently used
path :-). If URI is expecting @ to be encoded as %40, then I suppose
its rails' responsability to convert the %40 into a @ when
constructing the authorization header.

Override authorization_header so that the correct header is produced ? This might even work:

class X < ActiveResource::Base    self.site = "http://myplace.zendesk.com"    def (self.site).user      'foo@bar.com'    end    def (self.site).password      'xxx'    end end

X.site.user => "foo@bar.com"

Pretty skanky though. I think the right thing is probably for
authorization_header (in connection.rb) to unescape the username &
password.

Fred

Definitely skanky, but it works! Shame you have to do such a hack to get it working.

You are bloody brilliant Fred. I would’ve never thought of doing that.

Definitely skanky, but it works! Shame you have to do such a hack to
get it working.

When I get a moment I might ask over at rails core for less dirty
solutions :slight_smile:

Fred