Client gem for SSO Server gem @ https://github.com/flexnode/doorkeeper_sso
Current state of development: Alpha at best!
- Ruby 1.9 and above
- Rails 3.2 and above
- Postgres
Install project gem
gem 'doorkeeper_sso_client'Import migrations and run them
rake doorkeeper_sso_client:install:migrations
rake db:migrateCreate an initializer inside config/initializers (doorkeeper_sso_client.rb)
::DoorkeeperSsoClient::Config.configure do |config|
config[:oauth_client_id] = 123
config[:oauth_client_secret] = 'abc'
config[:base_uri] = 'http://localhost'
end
# List of Overridable defaults
default :sessions_path, '/sso/sessions'
default :oauth_login_path, '/auth/doorkeeper_sso'Add passport to your user model (user.rb)
has_many :passports, as: :identity, class_name: "DoorkeeperSsoClient::Passport"Ensure you link user model with passport on omniauth callback (user.rb)
def assign_from_omniauth(auth)
self.passports << DoorkeeperSsoClient::Passport.find_by_uid(auth["extra"]["passport_id"])
...Mount engine for Pingback functionality
MyApp::Application.routes.draw do
mount DoorkeeperSsoClient::Engine => "/doorkeeper_sso_client"If you use Devise, you can automatically log out users when their passport is invalid. Run activate sso on your main scope (eg :user) inside application_controller.rb It will automatically run validate_passport! whenever authenticate_user! is run
include DoorkeeperSsoClient::Mixins::Devise::ControllerHelpers
activate_sso :userNote : You can override authenticate_user! if you want customized behavior
Tests may start failing because the Devise::Test helpers do not account for passport inside of the session. Please add DoorkeeperSsoClient's TestHelpers into your spec/support/devise.rb file
RSpec.configure do |config|
config.include Devise::TestHelpers, :type => :controller
# Override test helpers
config.include DoorkeeperSsoClient::Mixins::Devise::TestHelpers, :type => :controllerYou must also ensure that all your controller tests set the passport_id inside the session. Eg
RSpec.describe "ControllerTestExample", :type => :controller do
let(:passport) { Fabricate('DoorkeeperSsoClient::Passport', identity: Fabricate(:user)) }
let(:user) { passport.identity }
before(:each) do
@request.env["devise.mapping"] = Devise.mappings[:user]
sign_in user
end
describe "GET index" do
it { get :index, nil, {'passport_id' => passport.uid} }
end- John - john@flexnode.com
- Doorkeeper Sso - Doorkeeper Sso Server gem