Using facebook connect (only) to authorize users with authlogic

Posted by lee on May 2nd, 2010

I’ve been working on our semi-stealthy new webapp for the last couple of months and I’ve been putting off fixing a bug for ages because it was so damned weird.

We want users to be able to sign-up with facebook connect, and not have to mess about creating a new account and setting Yet Another Password. So I grabbed authlogic and got the facebook connect plugin for it and got to work.

Everything was fine and dandy using facebook connect to authorize a bunch of existing users I had in my database, but as soon as it came to signing up new users, ruby would suddenly hit an infinite loop that would bring rails and my laptop to its knees.

I could see from the logs that it was some kind of validation failure:

SELECT * FROM `users` WHERE (`users`.`id` = '498') LIMIT 1
CACHE (0.0ms) SELECT * FROM `users` WHERE (`users`.`facebook_uid` = 1469530132) LIMIT 1
CACHE (0.0ms) SELECT `users`.id FROM `users` WHERE (`users`.`persistence_token` = BINARY '42baaa5f7ae2a550147ac0d88ffa72928ebc75d5ce23d5d65b3c87e972e9d848cf7ad5afb1bf532e2c2780a52f8a9c2bbeee43fce89d8cbbab69eddee10a0d4b' AND `users`.id <> 498) LIMIT 1
CACHE (0.0ms) SELECT * FROM `users` WHERE (`users`.`id` = '498') LIMIT 1
CACHE (0.0ms) SELECT * FROM `users` WHERE (`users`.`facebook_uid` = 1469530132) LIMIT 1
CACHE (0.0ms) SELECT `users`.id FROM `users` WHERE (`users`.`persistence_token` = BINARY '42baaa5f7ae2a550147ac0d88ffa72928ebc75d5ce23d5d65b3c87e972e9d848cf7ad5afb1bf532e2c2780a52f8a9c2bbeee43fce89d8cbbab69eddee10a0d4b' AND `users`.id <> 498) LIMIT 1
... etc ...

After lots of research and hair-pulling I managed to find a jewel of hint; ticket 68 in authlogic’s bug tracker. In your User model, add a before_connect method, (a hook provided by the authlogic/facebook plugin). It needs to tell authlogic that you need a new persistence token.

    def before_connect(facebook_session)
        logger.info("HEY FACEBOOK, HOW'S IT GOING? SO LOVELY TO SEE: #{facebook_session.user.name}")

        # Authlogic isn't as magic as we thought: tell it we need a persistence token, based on advice
        # in http://github.com/binarylogic/authlogic/issuesearch?state=closed&q=persistence#issue/68
        self.persistence_token = reset_persistence_token
    end

With the above in place, new users can register as quickly and easily as clicking facebook’s “Connect” button. Without the above, authlogic is left infinitely searching for a persistence token that hasn’t been, well, persisted.

Note: there’s nothing that says you must have a persistence token when using authlogic, and an alternative workaround is probably to configure your authlogic subsystem to use a different token scheme. However, the persistence token is a common web-based session model and we didn’t want to dump it.

Why Spotify Premium is too expensive, and how to fix it

Posted by lee on January 18th, 2010

I recently became a Spotify Premium customer, for two main reasons:

  1. I’d spent an afternoon listening to spotify at my desk and wanted to carry on listening to the same playlists on my iPhone while I was walking somewhere.
  2. As a technology guy I was curious if it was any good

So I forked out my £9.99 to give it a go for a month. Aside from the fact I had to use their website (rather than just tap an in-app “buy now” button on the iPhone), the sign-up experience was simple and easy.

The iPhone app is really good; it suffers from the same problem that all non-Apple music apps have on the iPhone, (namely that the music terminates if you leave the app to reply to an SMS or check your email). It’s not perfect, but it’s a really solid 1.0 release. Playing music over 3G appears to Just Work.

However, I won’t be renewing my subscription for a 2nd month because it’s just too expensive.

Don’t get me wrong, I expect Spotify Premium to be expensive: it offers up a huge proportion of the world’s commercial music for your listening pleasure on a ton of desktop and mobile platforms, ad-free with features like playlist management, integrated art work, artist and album browsing and search and plenty more.

But the kiss of death is that if I pay for Spotify every month for several years and then stop, I leave with NOTHING.

That’s just not a sensible investment in anybody’s book. £9.99 can buy me 2 or 3 albums per month if I’m a real bargain-hunter. By quitting Spotify after 2 years, (£240) I’ll be down by 80 albums.

Crazy.

How to help consumers justify Spotify Premium

If I pay for Premium for more than a month or two, that should tell Spotify that I’m basically a music lover, and every such user should be rewarded as such.

Why not create a system that allows me to accrue album credits for every continuous month I’m a paying customer? This both encourages loyalty to the subscription system as well as reinforcing a strong sense of value for money.

As a bare minimum, I should earn the ability to keep 1 or 2 albums per month at the end of my subscription.

If Spotify really want to be disruptive then I’ll get to accrue at least 5 albums worth of credits for every month I’m a subscriber (after some initial intro period of about 3 months).

For spotify, the infrastructure costs are practically identical - users get to download a tiny percentage of the tracks that they listen to, (which is already a premium feature to enable ‘offline listening’). The biggest issue is that of licensing - would the record labels be willing to allow a purchase-model of music to be integrated into the subscription streaming-model they’re currently charging for.

For consumers, it would mean Spotify Premium was no longer a frivolous throwaway cost, and could be looked at as a long term music investment that would likely involve even bigger spending on music because of Spotify’s enormous streamable catalogue.

That would at least start to give Mr iTunes and his music monopoly something to worry about.

Reblog this post [with Zemanta]

mig_constraints is not compatible with rails 2.3

Posted by lee on October 25th, 2009

Although it’s old, mig_constraints has sat in my rails plugin directory for a while now because it adds much needed foreign key support to ActiveRecord.

I’m on of those crazy guys that thinks a relational database should maintain relational integrity, so it’s been a staple of my rails projects for some time. Unfortunately when I recently upgraded to rails 2.3.4, it created a bizarre obscure error that seems to indicate it’s not compatible with rails 2.3 at all.

As far as I can tell, the best candidate for a replacement is this github project but I’ve not yet had the time to try it. For now I simply removed the plugin from my project and db:migrate reverted to a nice working state.

Read the rest of this entry »

Why is this guy’s face in my email?

Posted by lee on August 13th, 2009

I spend several hours a day with this guy, but I don’t even know his name.

He’s been following me around for several months, possibly longer.

Every day he sits and watches me as I do business, send personal messages to friends and family, and arrange my life.

He is… the gmail video chat advertising guy.

Who is that guy?

More to the point, am I the only one who finds instant messaging in their email client difficult to cope with? The immediacy of the interruption is unparalleled so I tend to keep “chat” turned off, which annoys colleagues. It’s important to get in the zone, and minimizing interruptions seems like an important way to improve my chances.

If you’re a professional programmer, do you still keep IM running all day?

Setting up a kick-ass rails server on Ubuntu 9.04 (Jaunty)

Posted by lee on June 27th, 2009

I recently created a new slicehost and thought I’d try the latest Ubuntu release with it. Unlike brightbox hosting, you only get a plain boring ubuntu installation out of the box on slicehost (and various other VPS-based hosting services).

A bit of aptitude

Ubuntu/Debian make it really nice and easy to install packages, but this time it still took me a couple of hours to install everything.

For my (and your) future reference, here’s all you need to create a full rails/mysql/apache platform on Ubuntu 9.04:

apt-get install rubygems ruby1.8-dev mysql-server-5.1 libmysqlclient15-dev apache2 libopenssl-ruby libxslt1-dev libcurl4-gnutls-dev build-essential apache2-prefork-dev libapr1-dev libaprutil1-dev libmagickwand-dev git-core subversion

gem install rails --version=2.2.2
gem install rake mysql passenger

cd /to/your/app
rake gems:install

Be sure to follow the instructions that appear after installing passenger, and then that’s it! Make sure you set the version number of rails that you need, or remove the –version parameter if you just want the latest stable release.

(Note: the last line assumes you’ve added all the gems your application requires to config/environment.rb. You could make the above list of packages even more minimal, but they cover plenty of common gem dependencies).

Going the extra mile

If you need to setup an environment to create screenshots programmatically, you’ll need a virtual X server, firefox and selenium (which is Java-based). That’s also fairly easy:

apt-get install xvfb firefox latex-xft-fonts sun-java6-jdk gsfonts-x11 sun-java6-fonts
gem install selenium-client

Do you have any must install packages when creating a new server? Please add them in the comments below.




© 2009 Lee Mallabone
Powered by Wordpress. Theme provided by Wordpress Themes - Absoluteshield Internet Eraser