rails_sso 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c4d48903a72cbc4b17e174fc2c9d9086d62e5787
4
- data.tar.gz: cd2858884d2731c62463f479d632d69732f745ff
3
+ metadata.gz: 870097ffd20610b11d2b2818e02be874f32f7a6b
4
+ data.tar.gz: 0d13485c9589191716ae0f067ecfebfdd8a6785e
5
5
  SHA512:
6
- metadata.gz: 635bfda00322076a73614662f89e7b5a40f557988ba1bddbe8de47cab90ac22f3b929ed36e6c991e6848f7466be6e871ab13b7e76aa309e6c251c4a0fb62f18b
7
- data.tar.gz: c2c3973789ff1a34cabadf07c3edf2778e0fc45560e4ec7f7fb8a8b5f4a8d3e22d478acf23b61f20531c8eefa787baa9e0c0a4c0f5476c82d9cab600c71fc448
6
+ metadata.gz: 9d06d4ed43b361abc3d727f5673c55f7cbcf94858993d5b3a9f349b63191fcddc7a509ca6ad1be8270c2adef37f164e1a326ae27bc29c2291061bce8f39cd590
7
+ data.tar.gz: 5c9b79893b2475cad864fa469b23205327b36c0601a1ff2515d1d0992042f58c6ec4c8a5bc7ff3537a68ded052a3d1992b66bf375204939f98723cc2266bee0f
data/README.md CHANGED
@@ -1,7 +1,10 @@
1
1
  # SSO client Rails Engine
2
2
 
3
+ [![Circle CI](https://circleci.com/gh/monterail/rails_sso/tree/master.svg?style=shield&circle-token=237c44548fb2c2597bcd0bc7b1dd99c81329e574)](https://circleci.com/gh/monterail/rails_sso/tree/master)
3
4
  [![Dependency Status](https://gemnasium.com/monterail/rails_sso.svg)](https://gemnasium.com/monterail/rails_sso)
4
5
  [![Gem Version](https://badge.fury.io/rb/rails_sso.svg)](http://badge.fury.io/rb/rails_sso)
6
+ [![Code Climate](https://codeclimate.com/github/monterail/rails_sso/badges/gpa.svg)](https://codeclimate.com/github/monterail/rails_sso)
7
+ [![Test Coverage](https://codeclimate.com/github/monterail/rails_sso/badges/coverage.svg)](https://codeclimate.com/github/monterail/rails_sso)
5
8
 
6
9
  ## About
7
10
 
@@ -18,12 +21,20 @@ gem 'omniauth-example'
18
21
  gem 'rails_sso'
19
22
  ```
20
23
 
21
- Configure it:
24
+ Install initializer and mount routes:
25
+
26
+ ```bash
27
+ bin/rails generate rails_sso
28
+ ```
29
+
30
+ Configure initializer:
22
31
 
23
32
  ```ruby
24
33
  # conifg/initializers/sso.rb
25
34
 
26
35
  RailsSso.configure do |config|
36
+ # url of entity provider
37
+ config.provider_url = 'https://example.com'
27
38
  # name of oauth2 provider
28
39
  config.provider_name = 'example'
29
40
  # oauth keys for omniauth-example
@@ -1,15 +1,30 @@
1
+ require 'json'
2
+
1
3
  module RailsSso
2
4
  class FetchUser
3
- def initialize(access_token)
4
- @access_token = access_token
5
+ def initialize(client)
6
+ @client = client
5
7
  end
6
8
 
7
9
  def call
8
- access_token.get(RailsSso.provider_profile_path).parsed
10
+ response = client.get(RailsSso.provider_profile_path)
11
+
12
+ case response.status
13
+ when 200
14
+ begin
15
+ JSON.parse(response.body)
16
+ rescue
17
+ response.body
18
+ end
19
+ when 401
20
+ raise ResponseError.new(:unauthenticated)
21
+ else
22
+ raise ResponseError.new(:unknown)
23
+ end
9
24
  end
10
25
 
11
26
  private
12
27
 
13
- attr_reader :access_token
28
+ attr_reader :client
14
29
  end
15
30
  end
@@ -0,0 +1,5 @@
1
+ en:
2
+ rails_sso:
3
+ errors:
4
+ unauthenticated: "You're not authenticated"
5
+ unknown: "Something wrong happened"
@@ -0,0 +1,13 @@
1
+ class RailsSsoGenerator < Rails::Generators::Base
2
+ source_root File.expand_path("../templates", __FILE__)
3
+
4
+ desc "Creates RailsSso initializer and mount sso routes."
5
+
6
+ def copy_initializer
7
+ template "sso.rb", "config/initializers/sso.rb"
8
+ end
9
+
10
+ def add_sso_routes
11
+ route "mount RailsSso::Engine => '/sso', as: 'sso'"
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ RailsSso.configure do |config|
2
+ # url of entity provider
3
+ config.provider_url = 'https://example.com'
4
+ # name of oauth2 provider
5
+ config.provider_name = 'example'
6
+ # oauth keys for omniauth-example
7
+ config.provider_key = ENV['PROVIDER_KEY']
8
+ config.provider_secret = ENV['PROVIDER_SECRET']
9
+ # path for fetching user data
10
+ config.provider_profile_path = '/api/v1/profile'
11
+ # set if you support single sign out
12
+ config.provider_sign_out_path = '/api/v1/session'
13
+ # enable cache (will use Rails.cache store)
14
+ config.use_cache = Rails.application.config.action_controller.perform_caching
15
+ end
@@ -0,0 +1,50 @@
1
+ require 'faraday'
2
+ require 'faraday-http-cache'
3
+
4
+ module RailsSso
5
+ class Client
6
+ def initialize(url, &block)
7
+ @connection = Faraday.new(url, &block)
8
+ end
9
+
10
+ def token!(token)
11
+ @token = token
12
+
13
+ self
14
+ end
15
+
16
+ def get(url, params = {})
17
+ request(:get, url, params)
18
+ end
19
+
20
+ def post(url, params = {})
21
+ request(:post, url, params)
22
+ end
23
+
24
+ def put(url, params = {})
25
+ request(:put, url, params)
26
+ end
27
+
28
+ def delete(url, params = {})
29
+ request(:delete, url, params)
30
+ end
31
+
32
+ def patch(url, params = {})
33
+ request(:patch, url, params)
34
+ end
35
+
36
+ private
37
+
38
+ attr_reader :connection, :token
39
+
40
+ def request(verb, url, params = {})
41
+ connection.send(verb) do |req|
42
+ req.headers['Authorization'] = "Bearer #{token}"
43
+ req.headers['Content-Type'] = 'application/json'
44
+
45
+ req.url(url)
46
+ req.body = params.to_json
47
+ end
48
+ end
49
+ end
50
+ end
@@ -19,7 +19,9 @@ module RailsSso
19
19
  end
20
20
 
21
21
  def access_token
22
- RailsSso::AccessToken.new(session[:access_token], session[:refresh_token])
22
+ OAuth2::AccessToken.new(oauth2_strategy.client, session[:access_token], {
23
+ refresh_token: session[:refresh_token]
24
+ })
23
25
  end
24
26
 
25
27
  def invalidate_access_token!
@@ -45,14 +47,35 @@ module RailsSso
45
47
 
46
48
  private
47
49
 
50
+ def oauth2_strategy
51
+ oauth2_strategy_class.new(nil, RailsSso.provider_key, RailsSso.provider_secret)
52
+ end
53
+
54
+ def oauth2_strategy_class
55
+ "OmniAuth::Strategies::#{RailsSso.provider_name.camelize}".constantize
56
+ end
57
+
58
+ def provider_client
59
+ @provider_client ||= RailsSso::Client.new(RailsSso.provider_url) do |conn|
60
+ if RailsSso.use_cache
61
+ conn.use :http_cache,
62
+ store: Rails.cache,
63
+ logger: Rails.logger,
64
+ shared_cache: false
65
+ end
66
+
67
+ conn.adapter Faraday.default_adapter
68
+ end
69
+ end
70
+
48
71
  def fetch_user_data
49
72
  return unless session[:access_token]
50
73
 
51
- RailsSso::FetchUser.new(access_token).call
52
- rescue ::OAuth2::Error
74
+ RailsSso::FetchUser.new(provider_client.token!(session[:access_token])).call
75
+ rescue ResponseError => e
53
76
  refresh_access_token! do
54
- RailsSso::FetchUser.new(access_token).call
55
- end
77
+ RailsSso::FetchUser.new(provider_client.token!(session[:access_token])).call
78
+ end if e.code == :unauthenticated
56
79
  end
57
80
  end
58
81
  end
@@ -0,0 +1,11 @@
1
+ module RailsSso
2
+ class ResponseError < StandardError
3
+ attr_reader :code
4
+
5
+ def initialize(code)
6
+ @code = code
7
+
8
+ super(I18n.t("rails_sso.errors.#{code}"))
9
+ end
10
+ end
11
+ end
@@ -1,3 +1,3 @@
1
1
  module RailsSso
2
- VERSION = "0.2.1"
2
+ VERSION = "0.3.0"
3
3
  end
data/lib/rails_sso.rb CHANGED
@@ -2,6 +2,7 @@ module RailsSso
2
2
  mattr_accessor :application_controller
3
3
  @@application_controller = 'ApplicationController'
4
4
 
5
+ mattr_accessor :provider_url
5
6
  mattr_accessor :provider_name
6
7
  mattr_accessor :provider_key
7
8
  mattr_accessor :provider_secret
@@ -29,4 +30,5 @@ require 'omniauth-oauth2'
29
30
  require 'rails_sso/version'
30
31
  require 'rails_sso/engine'
31
32
  require 'rails_sso/helpers'
32
- require 'rails_sso/access_token'
33
+ require 'rails_sso/client'
34
+ require 'rails_sso/response_error'
@@ -1,6 +1,16 @@
1
1
  require File.expand_path('../boot', __FILE__)
2
2
 
3
- require 'rails/all'
3
+ %w(
4
+ action_controller
5
+ action_view
6
+ rails/test_unit
7
+ sprockets
8
+ ).each do |framework|
9
+ begin
10
+ require "#{framework}/railtie"
11
+ rescue LoadError
12
+ end
13
+ end
4
14
 
5
15
  Bundler.require(*Rails.groups)
6
16
  require "rails_sso"
@@ -20,7 +30,7 @@ module Dummy
20
30
  # config.i18n.default_locale = :de
21
31
 
22
32
  # Do not swallow errors in after_commit/after_rollback callbacks.
23
- config.active_record.raise_in_transactional_callbacks = true
33
+ # config.active_record.raise_in_transactional_callbacks = true
24
34
  end
25
35
  end
26
36
 
@@ -14,13 +14,13 @@ Rails.application.configure do
14
14
  config.action_controller.perform_caching = false
15
15
 
16
16
  # Don't care if the mailer can't send.
17
- config.action_mailer.raise_delivery_errors = false
17
+ # config.action_mailer.raise_delivery_errors = false
18
18
 
19
19
  # Print deprecation notices to the Rails logger.
20
20
  config.active_support.deprecation = :log
21
21
 
22
22
  # Raise an error on page load if there are pending migrations.
23
- config.active_record.migration_error = :page_load
23
+ # config.active_record.migration_error = :page_load
24
24
 
25
25
  # Debug mode disables concatenation and preprocessing of assets.
26
26
  # This option may cause significant delays in view rendering with a large
@@ -75,5 +75,5 @@ Rails.application.configure do
75
75
  config.log_formatter = ::Logger::Formatter.new
76
76
 
77
77
  # Do not dump schema after migrations.
78
- config.active_record.dump_schema_after_migration = false
78
+ # config.active_record.dump_schema_after_migration = false
79
79
  end
@@ -29,7 +29,7 @@ Rails.application.configure do
29
29
  # Tell Action Mailer not to deliver emails to the real world.
30
30
  # The :test delivery method accumulates sent emails in the
31
31
  # ActionMailer::Base.deliveries array.
32
- config.action_mailer.delivery_method = :test
32
+ # config.action_mailer.delivery_method = :test
33
33
 
34
34
  # Randomize the order test cases are executed.
35
35
  config.active_support.test_order = :random
@@ -1,4 +1,5 @@
1
1
  RailsSso.configure do |config|
2
+ config.provider_url = 'http://example.com'
2
3
  config.provider_name = 'developer'
3
4
  config.provider_key = 'key'
4
5
  config.provider_secret = 'secret'
@@ -0,0 +1,4 @@
1
+  (11.2ms) CREATE TABLE "schema_migrations" ("version" varchar NOT NULL) 
2
+  (0.1ms) select sqlite_version(*)
3
+  (15.7ms) CREATE UNIQUE INDEX "unique_schema_migrations" ON "schema_migrations" ("version")
4
+ ActiveRecord::SchemaMigration Load (0.1ms) SELECT "schema_migrations".* FROM "schema_migrations"