Helper to simplify RPX Now user login/creation

gem install rpx_now -v 0.7.0


Janrain Engage (formerly known as RPXNow):

  • Login to your page through Facebook / Twitter / Myspace / Google / OpenId / MS-LiveId / AOL / ...
  • Simpler then OpenId/OAuth/xxx for developers AND users
  • Publish user activity to facebook/twitter/myspace/.../-stream via the same API
  • Returning users are greeted by their choosen provider
  • Free for up to 2500 accounts/year (above 5k it gets expensive...)

Single Interface for all providers Share comments and activities Visitors choose from providers they already have



gem install rpx_now


Example application, go play around!


RPXNow.api_key = "YOU RPX API KEY"


This example uses the SessionsController, if you dont have one built it and add routes(rpx_token is a post request)

skip_before_filter :verify_authenticity_token, :only => [:rpx_token] # RPX does not pass Rails form tokens...

# user_data
# found: {:name=>'John Doe', :username => 'john', :email=>'', :identifier=>''}
# not found: nil (can happen with e.g. invalid tokens)
def rpx_token
  raise "hackers?" unless data = RPXNow.user_data(params[:token])
  self.current_user = User.find_by_identifier(data[:identifier]) || User.create!(data)
  redirect_to '/'

# getting additional profile fields (these fields are rarely filled)
# all possibilities:
data = RPXNow.user_data(params[:token], :additional => [:gender, :birthday, :photo, :providerName, ...])

# normal + raw data
RPXNow.user_data(params[:token], :additional => [:raw_response])[:raw_response]['profile]['verifiedEmail']

# only raw data
email = RPXNow.user_data(params[:token], :raw_response => true)['profile']['verifiedEmail']

# with extended info like friends, accessCredentials, portable contacts. (most Providers do not supply them)
RPXNow.user_data(params[:token], :extended => true)[:extended]['friends'][...have a look at the RPX API DOCS...]


<%=RPXNow.embed_code('My-Rpx-Domain', url_for(:controller => :session, :action => :rpx_token, :only_path => false))%>
<%=RPXNow.popup_code('Login here...', 'My-Rpx-Domain', url_for(:controller => :session, :action => :rpx_token, :only_path => false), options)%>


:language => 'en' janrain tries to detect the users language, but you may overwrite it possible languages
:default_provider => 'google' possible default providers
:flags => 'show_provider_list' possible flags
:html => {:id => 'xxx'} is added to the popup link (popup_code only)
:fallback_url => :enable forces fallback link to /openid/embed url (default)
:fallback_url => :disable disables fallback url (will mean Javascript is required for users to sign in)
:fallback_url => :legacy forces fallback to legacy widget url

For more on the status of fallback URLs see Janrain Support Forum discussion

Unobtrusive / JS-last

popup_code can also be called with :unobtrusive => true ( --> just link without javascript include). To still get the normal popup add RPXNow.popup_source('My-Rpx-Domain', url_for(:controller => :session, :action => :rpx_token, :only_path => false), [options])
Options like :language / :flags should be given for both.



RPXNow.api_version = 2

Custom domain (Plus/Pro)

RPXNow.domain = ''

Mappings (Plus/Pro)

You can map your primary keys (e.g. to identifiers, so that
users can login to the same account with multiple identifiers., primary_key) #add a mapping
RPXNow.unmap(identifier, primary_key) #remove a mapping
RPXNow.mappings(primary_key) # [identifier1,identifier2,...]
RPXNow.all_mappings # [["1",['','']], ["2",[...]], ... ]

After a primary key is mapped to an identifier, when a user logs in with this identifier, RPXNow.user_data will contain his primaryKey as :id. A identifyer can only belong to one user (in doubt the last one it was mapped to)

User integration (e.g. ActiveRecord)

class User < ActiveRecord::Base
  include RPXNow::UserIntegration

user.rpx.identifiers == RPXNow.mappings( ==,
user.rpx.unmap(identifier) == RPXNow.unmap(identifier,

Contacts (Pro)

Retrieve all contacts for a given user: RPXNow.contacts(identifier).each {|c| puts "#{c['displayName']}: #{c['emails']}}

Status updates (Pro)

Send a status update to provider (a tweet/facebook-status/...) : RPXNow.set_status(identifier, "I just registered at ...")

Activity (Pro)

Post a users activity, on their e.g. Facebook profile, complete with images, titels, rating, additional media, customized links and so on ...

RPXNow.activity( identifier,
  :url => href, :action => 'Im loving my new', :user_generated_content => 'Im loving my new ... ',
  :title => product.title, :description => product.description,
  :action_links => [{:text => 'view >>', :href => product_url(product, :only_path => false)}],
  :media => [{:type => :image, :src => product.image_url, :href => product_url(product, :only_path => false)}]

Offline user data access (Plus/Pro)

Same response as auth_info but can be called with a identifier at any time.
Offline Profile Access must be enabled.

RPXNow.get_user_data(identifier, :extended => true)

Auth info

Same response as user_data with :raw_response, but without any kind of failure detection or post processing. RPXNow.auth_info(params[:token])


rpx_now_gem mailing list


Michael Grosser
Hereby placed under public domain, do what you want, just do not hold me accountable...