Commit 472d9047b9e0aa20fe8d3cca2d135a0ddce2ae0b
Committed by
Eduardo Silva Araújo
1 parent
ffb9d386
Exists in
colab
[Colab] Implement callbacks and initial tests for Omniauth Remote User
Signed-off-by: Heitor Reis Ribeiro <marcheing@gmail.com>
Showing
8 changed files
with
64 additions
and
7 deletions
Show diff stats
| ... | ... | @@ -0,0 +1,16 @@ |
| 1 | +module Users | |
| 2 | + class OmniauthCallbacksController < Devise::OmniauthCallbacksController | |
| 3 | + def all | |
| 4 | + auth = request.env["omniauth.auth"] | |
| 5 | + user = User.find_or_create_by(email: auth.info.email, name: auth.info.name, provider: auth.provider, uid: auth.uid) | |
| 6 | + | |
| 7 | + if user.valid? | |
| 8 | + sign_in_and_redirect user | |
| 9 | + else | |
| 10 | + raise "Fuck you: #{user.errors.full_messages}" | |
| 11 | + end | |
| 12 | + end | |
| 13 | + | |
| 14 | + alias_method :RemoteUser, :all | |
| 15 | + end | |
| 16 | +end | |
| 0 | 17 | \ No newline at end of file | ... | ... |
app/views/devise/shared/_links.erb
| ... | ... | @@ -20,6 +20,6 @@ |
| 20 | 20 | |
| 21 | 21 | <%- if devise_mapping.omniauthable? %> |
| 22 | 22 | <%- resource_class.omniauth_providers.each do |provider| %> |
| 23 | - <%= link_to t('.sign_in_with_provider', :provider => provider.to_s.titleize, :default => "Sign in with #{provider.to_s.titleize}"), omniauth_authorize_path(resource_name, provider), class: 'btn btn-info' %> | |
| 23 | + <%= link_to t('.sign_in_with_provider', :provider => provider.to_s.titleize, :default => "Sign in with #{provider.to_s.titleize}"), user_omniauth_authorize_path(provider), class: 'btn btn-info' %> | |
| 24 | 24 | <% end -%> |
| 25 | 25 | <% end -%> |
| 26 | 26 | \ No newline at end of file | ... | ... |
config/initializers/devise.rb
| ... | ... | @@ -231,6 +231,7 @@ Devise.setup do |config| |
| 231 | 231 | # Add a new OmniAuth provider. Check the wiki for more information on setting |
| 232 | 232 | # up on your models and hooks. |
| 233 | 233 | # config.omniauth :github, 'APP_ID', 'APP_SECRET', :scope => 'user,public_repo' |
| 234 | + config.omniauth :RemoteUser | |
| 234 | 235 | |
| 235 | 236 | # ==> Warden configuration |
| 236 | 237 | # If you want to use other strategies, that are not supported by Devise, or | ... | ... |
config/routes.rb
| ... | ... | @@ -51,7 +51,7 @@ Rails.application.routes.draw do |
| 51 | 51 | |
| 52 | 52 | |
| 53 | 53 | # See comment above for devise_for |
| 54 | - devise_for :users, only: :omniauth_callbacks | |
| 54 | + devise_for :users, only: :omniauth_callbacks, :controllers => { :omniauth_callbacks => "users/omniauth_callbacks" } | |
| 55 | 55 | # The priority is based upon order of creation: first created -> highest priority. |
| 56 | 56 | # See how all your routes lay out with "rake routes". |
| 57 | 57 | ... | ... |
features/step_definitions/user_steps.rb
| ... | ... | @@ -31,3 +31,25 @@ When(/^I click the "(.*?)" icon$/) do |icon| |
| 31 | 31 | find('#' + icon).click # the hashtag symbol is necessary to find the id of a HTML element |
| 32 | 32 | sleep(1) #This sleep is essential to make the popup visible when we take a picture of the page |
| 33 | 33 | end |
| 34 | + | |
| 35 | +Given(/^I am logged in as a Colab user$/) do | |
| 36 | + colab_user = FactoryGirl.build(:colab_user) | |
| 37 | + first_name, last_name = colab_user.name.partition(' ') | |
| 38 | + | |
| 39 | + set_header('HTTP_REMOTE_USER', colab_user.uid) | |
| 40 | + set_header('HTTP_REMOTE_USER_DATA', { | |
| 41 | + 'nickname': colab_user.uid, | |
| 42 | + 'name': colab_user.name, | |
| 43 | + 'firstname': first_name, | |
| 44 | + 'lastname': last_name, | |
| 45 | + 'email': colab_user.email | |
| 46 | + }.to_json) | |
| 47 | +end | |
| 48 | + | |
| 49 | +Then(/^I should be at the Home page$/) do | |
| 50 | + expect(current_path).to be("/") | |
| 51 | +end | |
| 52 | + | |
| 53 | +Then(/^I should be logged in$/) do | |
| 54 | + expect(page).to have_no_link("Sign In") | |
| 55 | +end | |
| 34 | 56 | \ No newline at end of file | ... | ... |
features/support/hooks.rb
| 1 | +require_relative 'header' | |
| 2 | + | |
| 1 | 3 | After do |scenario| |
| 2 | 4 | # Do something after each scenario. |
| 3 | 5 | # The +scenario+ argument is optional, but |
| ... | ... | @@ -8,11 +10,7 @@ end |
| 8 | 10 | |
| 9 | 11 | # Run all acceptance tests on the default language |
| 10 | 12 | Before do |scenario| |
| 11 | - if defined?(page) && ! page.driver.nil? | |
| 12 | - header_method = [:add_header, :header].find(&page.driver.method(:respond_to?)) | |
| 13 | - page.driver.send(header_method, 'Accept-Language', I18n.default_locale) if header_method | |
| 14 | - end | |
| 15 | - | |
| 13 | + set_header('Accept-Language', I18n.default_locale) | |
| 16 | 14 | I18n.locale = I18n.default_locale |
| 17 | 15 | end |
| 18 | 16 | ... | ... |
| ... | ... | @@ -0,0 +1,12 @@ |
| 1 | +Feature: Omniauth authentication | |
| 2 | + In order to sign in more easily | |
| 3 | + As a regular user | |
| 4 | + I want to authenticate with an external provider | |
| 5 | + | |
| 6 | + Scenario: through Colab | |
| 7 | + Given I am logged in as a Colab user | |
| 8 | + And I am at the homepage | |
| 9 | + And I click the Sign In link | |
| 10 | + When I click the Sign in with Remote User link | |
| 11 | + Then I should be at the Home page | |
| 12 | + And I should be logged in | |
| 0 | 13 | \ No newline at end of file | ... | ... |
spec/factories/users.rb