saml_camel 0.1.6 → 0.1.7

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: ce19d32b4ed9a740fc2af74f8ee5153b1605c6b7
4
- data.tar.gz: 8c239788aca69ceefe788cc2112525160fe35d86
3
+ metadata.gz: f5ae86d2afccc6e4f06cecbce01cb9c8e7b26340
4
+ data.tar.gz: 200725807b56d5a93dd488edd9ac18bdd1a5006b
5
5
  SHA512:
6
- metadata.gz: f8a289587609b90ded6d97d4d878d23c9f6f382b8870d45ae69f1fd694f0679dc132fd86dc0bdd2b379da3e7574272ad969a6e3ec86ba1ac6dc7a1d7ced2ee26
7
- data.tar.gz: 7a6aa2ebb91f906ac537e6e2204fd17d3ce1add3f95555e0dd80194b1b77f8b35a5fbf07f08d4cd19d617cf118637780e4c6a368ed707cb29ea608f143d07093
6
+ metadata.gz: 1b665b05d63a9f28fa45f79b48067de8e18daebb9f530223174b48195e676ebd08abf984a853a11c7fc1c61cd0db354098bba25a9db47da0b49136c70b55ebcb
7
+ data.tar.gz: e13b5b41e5d628f99a75da7be03b06d2671ea60d26e3fc5280aa07be80b43245ae9dc63303878bffbdcedc90183c19e43650caa667ae209955bcd240adeb1f6d
data/README.md CHANGED
@@ -16,20 +16,21 @@ $ bundle
16
16
  ## Usage
17
17
  ### IMPORTANT: This step enables security features and is required to use the gem!
18
18
  1. in your environments config (`config/development.rb` for example) ensure that you have caching configured as follows
19
- **note** use ths cache_store most appropriate for your situation. It may make more sense to use a file store, or a redis server
19
+
20
+ **NOTE:** use ths cache_store most appropriate for your situation. It may make more sense to use a file store, or a redis server
20
21
  ```ruby
21
22
  config.action_controller.perform_caching = true
22
23
  config.cache_store = :memory_store
23
24
  ```
24
25
 
25
- 1. run `rake saml_camel:generate_saml` to generate metadata files for each environment. you can also specify a custom environment like this `rake saml_camel:generate_saml environment=acceptance`
26
+ 2. run `rake saml_camel:generate_saml` to generate metadata files for each environment. you can also specify a custom environment like this `rake saml_camel:generate_saml environment=acceptance`
26
27
 
27
- **Note: these steps will use development as an example, if you use separate metadata per environment, you will repeat each step for your chosen environment**
28
+ **Note: these steps will use development as an example, if you use separate metadata per environment, you will repeat each step for your chosen environment**
28
29
 
29
- 2. from the root of your app open `saml/development/settings.json` and specify an entity ID of your choice. this is a unique identifier used by the
30
+ 3. from the root of your app open `saml/development/settings.json` and specify an entity ID of your choice. this is a unique identifier used by the
30
31
  Identity Provider(idp) to recognize your app. Typically it should take the form of a url, however note that it is just an identifier and does not have to resolve (e.g. https://my-app-name/not/a/real/route)
31
32
 
32
- 3. Go to https://authentication.oit.duke.edu/manager/register/sp and register your metadata with the identity provider. You will need the values from `saml/development/settings.json` in addition to the `saml/development/saml_certificate.crt`
33
+ 4. Go to https://authentication.oit.duke.edu/manager/register/sp and register your metadata with the identity provider. You will need the values from `saml/development/settings.json` in addition to the `saml/development/saml_certificate.crt`
33
34
 
34
35
  - copy the entity_id you chose in the `settings.json` file and paste it into the "Entity Field"
35
36
  - fill out functional purpose, responsible dept, function owner dept, and audience with information relevant to your application
@@ -37,38 +38,71 @@ Identity Provider(idp) to recognize your app. Typically it should take the form
37
38
  - copy the acs value and paste it into the Location field in the Assertion Consumer Service box
38
39
  - note that the default host value for ACS is `http://locahost:3000` which is the default `rails s` host. If you're using a differnet host (such as in production or using docker) you will want to replace the host value with what is relevent for your situation(*e.g. https://my-app.duke.edu/saml/consumeSaml*), but keep the path `/saml/consumeSaml`
39
40
 
40
- 4. In your app mount the engine in config/routes.rb
41
- ```ruby
42
- mount SamlCamel::Engine, at: "/saml"
43
- ```
44
-
41
+ 5. In your app mount the engine in config/routes.rb
42
+ ```ruby
43
+ mount SamlCamel::Engine, at: "/saml"
44
+ ```
45
45
 
46
46
  6. now simply provide the `saml_protect` method in your controllers (via `before_action`) to protect paths
47
47
  ```ruby
48
- class DashboardController < ApplicationController
49
- before_action :saml_protect, except: [:home]
48
+ class DashboardController < ApplicationController
49
+ before_action :saml_protect, except: [:home]
50
50
 
51
- def home
52
- end
51
+ def home
52
+ end
53
53
 
54
- def index
54
+ def index
55
+ end
55
56
  end
56
-
57
- end
58
57
  ```
59
58
 
60
-
61
59
  7. to logout simply make a post to `localhost:3000/saml/logout`. This will kill the local saml session, and the session with the identity provider.
62
60
 
63
61
  7. response attributes found in `session[:saml_attributes]`
62
+ *note that the session can not store over the 4 kilobyte limit. Keep
63
+ this in mind in the use case of requesting a significant amount of attributes*
64
64
 
65
65
  8. It is recommended to set `config.force_ssl = true` in the `config/environments/production.rb` file for security
66
66
 
67
-
68
67
  9. Logging is turned on by default. Logging is configured in `saml/development/settings.json`. To utilize logging saml_logging should be set to true (default), and primary_id must have a value. primary_id is the saml attribute you consider to be a primary identifier for a user
69
68
 
70
69
  10. Users can go to http://localhost:3000/saml/attributes to view attributes being passed through
71
70
 
71
+ ## Example settings.json
72
+ ```json
73
+ {
74
+ "_comment": "note you will need to restart the application when you make changes to this file",
75
+ "settings": {
76
+ "acs": "http://localhost:3000/saml/consumeSaml",
77
+ "entity_id": "http://my-entity-id.corgi",
78
+ "sso_url": "https://shib.oit.duke.edu/idp/profile/SAML2/Redirect/SSO",
79
+ "logout_return_url": "http://localhost:3000",
80
+ "primary_id": "eduPersonPrincipalName",
81
+ "saml_logging": true
82
+ },
83
+ "attribute_map": {
84
+ "urn:oid:1.3.6.1.4.1.5923.1.1.1.9": "eduPersonScopedAffiliation",
85
+ "urn:oid:1.3.6.1.4.1.5923.1.1.1.6": "eduPersonPrincipalName",
86
+ "urn:oid:2.5.4.3": "cn",
87
+ "urn:oid:0.9.2342.19200300.100.1.1": "uid",
88
+ "urn:oid:0.9.2342.19200300.100.1.3": "mail",
89
+ "urn:oid:1.3.6.1.4.1.5923.1.1.1.5": "eduPersonPrimaryAffiliation",
90
+ "urn:oid:2.16.840.1.113730.3.1.241": "displayName",
91
+ "urn:mace:duke.edu:idms:unique-id": "duDukeID",
92
+ "urn:mace:duke.edu:idms:dku-id": "dku-id",
93
+ "urn:oid:1.3.6.1.4.1.5923.1.5.1.1": "isMemberOf",
94
+ "urn:oid:2.5.4.42": "givenName",
95
+ "urn:oid:2.5.4.4": "sn",
96
+ "urn:oid:2.5.4.11": "ou",
97
+ "urn:oid:1.3.6.1.4.1.5923.1.1.1.1": "eduPersonAffiliation",
98
+ "urn:oid:2.5.4.20": "telephoneNumber",
99
+ "urn:oid:2.5.4.12": "title",
100
+ "urn:mace:duke.edu:idms:middle-name1": "duMiddleName1",
101
+ "urn:mace:duke.edu:idms:proxy-token": "duProxyToken"
102
+ }
103
+ }
104
+ ```
105
+
72
106
 
73
107
  ## License
74
108
  The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
@@ -7,11 +7,12 @@ module SamlCamel::SamlHelpers
7
7
 
8
8
  #this generates a call to the idp, which will then be returned to the consume action the in saml_contorller
9
9
  def saml_request(host_request)
10
- relay_state = SecureRandom.base64.chomp.gsub( /\n/, '' ) #set relay state to secure against replay attack
10
+ relay_state = SecureRandom.base64.chomp.gsub( /\W/, '' ) #set relay state to secure against replay attack
11
11
  request = OneLogin::RubySaml::Authrequest.new
12
12
 
13
13
  #store relay state, ip address and original url request in memory to be used for verification and redirect after response
14
- permit_key = session[:session_id].to_sym
14
+ assign_permit_key
15
+ permit_key = session[:saml_session_id].to_sym
15
16
  Rails.cache.fetch(permit_key, expires_in: 5.minutes) do
16
17
  {ip_address: host_request.remote_ip, relay_state: relay_state, redirect_url: host_request.url }
17
18
  end
@@ -22,7 +23,7 @@ module SamlCamel::SamlHelpers
22
23
 
23
24
  #validates the user ip address and relay state given to IDP. Prevents Replay Attacks.
24
25
  def valid_state(param_relay_state, remote_ip)
25
- permit_key = session[:session_id].to_sym
26
+ permit_key = session[:saml_session_id].to_sym
26
27
  saml_cache = Rails.cache.fetch(permit_key)
27
28
  stored_relay = saml_cache[:relay_state]
28
29
  stored_ip = saml_cache[:ip_address]
@@ -52,4 +53,8 @@ module SamlCamel::SamlHelpers
52
53
  session[:saml_success] = nil
53
54
  end
54
55
 
56
+ def assign_permit_key
57
+ session[:saml_session_id] = SecureRandom.base64.chomp.gsub( /\W/, '' )
58
+ end
59
+
55
60
  end
@@ -1,8 +1,6 @@
1
1
  module SamlCamel
2
2
  class ApplicationController < ActionController::Base
3
3
  protect_from_forgery with: :exception
4
- def saml_stuff
5
- puts "boo" * 80
6
- end
4
+
7
5
  end
8
6
  end
@@ -16,13 +16,13 @@ module SamlCamel
16
16
  #consumes the saml response from the IDP
17
17
  def consume
18
18
  raise "Invalid RelayState" unless valid_state(params[:RelayState], request.remote_ip)
19
- permit_key = session[:session_id].to_sym
19
+ permit_key = session[:saml_session_id].to_sym
20
20
  redirect_path = Rails.cache.fetch(permit_key)[:redirect_url]
21
21
  Rails.cache.delete(permit_key) #we no longer need cache at this stage
22
+ session[:saml_session_id] = nil
22
23
 
23
24
  response = OneLogin::RubySaml::Response.new(params[:SAMLResponse], :settings => saml_settings)
24
25
  response.settings = saml_settings
25
-
26
26
  if response.is_valid? # validate the SAML Response
27
27
  # authorize_success, log the user
28
28
  session[:saml_success] = true
@@ -31,11 +31,11 @@ module SamlCamel
31
31
  session[:saml_attributes] = SamlCamel::Transaction.map_attributes(response.attributes)
32
32
  SamlCamel::Logging.successfull_auth(session[:saml_attributes])
33
33
 
34
-
35
34
  redirect_to redirect_path
36
35
  else # otherwise list out the errors in the response
37
- permit_key = session[:session_id].to_sym
36
+ permit_key = session[:saml_session_id].to_sym
38
37
  Rails.cache.delete(permit_key)
38
+ session[:saml_session_id] = nil
39
39
 
40
40
  session[:saml_success] = false
41
41
  response.errors
@@ -44,9 +44,10 @@ module SamlCamel
44
44
  redirect_to action: "failure", locals:{errors: response.errors}
45
45
  end
46
46
  rescue => e
47
- permit_key = session[:session_id].to_sym
47
+ permit_key = session[:saml_session_id].to_sym
48
48
  Rails.cache.delete(permit_key)
49
49
  session[:saml_success] = false
50
+ session[:saml_session_id] = nil
50
51
 
51
52
  SamlCamel::Logging.auth_failure(e)
52
53
  redirect_to action: "failure", locals:{errors: e}
@@ -64,7 +65,6 @@ module SamlCamel
64
65
  SamlCamel::Logging.logout(session[:saml_attributes])
65
66
  session[:saml_attributes] = nil
66
67
  session[:sp_session] = nil
67
- cookies.delete :saml_camel_timestamp
68
68
 
69
69
  # return_url = SamlCamel::Transaction.logout #this methods logs the user out of the IDP, and returns a url to be redirected to
70
70
  redirect_to "https://shib.oit.duke.edu/cgi-bin/logout.pl"
@@ -1,3 +1,3 @@
1
1
  module SamlCamel
2
- VERSION = '0.1.6'
2
+ VERSION = '0.1.7'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: saml_camel
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - 'Danai Adkisson '
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-04-17 00:00:00.000000000 Z
11
+ date: 2018-04-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails