cadenero 0.0.2.b6 → 0.0.2.b7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- YThjNmYyZmE3NmM0MjAxYzUwZDdmOWU4NDgwYWI1NTBiNGFkYWM2Zg==
4
+ Y2Y5NTFlM2YzZjVjMzY2OTBjMDg2ZDA2NmVhZWY1MmM4OWUzYTc4OA==
5
5
  data.tar.gz: !binary |-
6
- ZGJlZjBlZGE5YTRmZGYzMmQ4MGM3OGRhYjJjYTEwYjg4ZTk3OTU2Zg==
6
+ MjE3ZTBmODY0MDJlOGRkYTQ0NjYwYTVlOTAyMzY3YWEwNjRlOGUxMg==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- NDMyZDdmZDBmNGUxZmZjMWU5YjMyMDI5OTU2YTRkZGMxMGJkOGY3YTMzMTFk
10
- YTgxNGY4MzE2YmVmMTIyNTczOTM1OTQ3Nzg2MDRkZWYxYjAxMmY1ZjgzY2Nm
11
- ODM0ZGRiN2IwMzJhYjQ0NzJiMjQ2OTMzN2ZiMGRkMmM4NjVkNTI=
9
+ NGYyN2MyNDk2YWVjYWE0ZWIyZDcyNjEzMWNlNzA1MTMwNzQ5YzQ1MDM5NmZk
10
+ NjU1ZDljZmYyYzk0YWVhZTU3YmJjMDY2MjVkYTEzMzdlNThiMDEyZWZkM2M2
11
+ YTRjYWViNzczZmY0MTEyNDdkYmRjYWVhN2Y2YWM1MDJlYTE4OWY=
12
12
  data.tar.gz: !binary |-
13
- YzdkZTgxMzQ3MzBmMTMxNDMzNGU2ODU3YjNjY2U2NTcxNDg3MjhhZmI5NWU3
14
- NzgwYzFhODUxZGI4Y2Y4ZDk0YjU2Njk5ODNkNWY0NWQ0YWQ1M2RmNWMwYzFj
15
- NmY1ZmNjMmE3NzA0OWM2YTU0NjllYTdjNDM1ZWZhODgxZGIxZWM=
13
+ NmZhYmMyMDEwNzAzOTMxYmNlYjM5YzBmMzIyY2FhNDc5MTkzZTM3NzJjYTJh
14
+ NjAwNjYyMDliMmY1NmZkZTdmY2U4YjNiZGNjNzViMjc5YzEzNDg2MmViZDE5
15
+ OGJkOTc1ZmZjNzBiMzA4YzgzZjZlMTg1ZmE5MTdhYjQxYTg4ZWE=
data/README.md CHANGED
@@ -7,6 +7,8 @@ By [![Agiltec Logo](https://launchrock-assets.s3.amazonaws.com/logo-files/Gpujzv
7
7
  [![Coverage Status](https://coveralls.io/repos/AgilTec/cadenero/badge.png?branch=master)](https://coveralls.io/r/AgilTec/cadenero?branch=master)
8
8
  [![Dependency Status](https://gemnasium.com/AgilTec/cadenero.png)](https://gemnasium.com/AgilTec/cadenero)
9
9
 
10
+ THIS README IS FOR THE MASTER BRANCH OF **CADENERO** AND REFLECTS THE WORK CURRENTLY EXISTING ON THE MASTER BRANCH. IF YOU ARE WISHING TO USE A NON-MASTER BRANCH OF **CADENERO**, PLEASE CONSULT THAT BRANCH'S README AND NOT THIS ONE.
11
+
10
12
  Authentication Engine for Rails.API multitenant RESTful APIs based on Warden. It:
11
13
  * Is Racked based
12
14
  * Use token authentication as strategy for the API
@@ -17,22 +19,43 @@ Authentication Engine for Rails.API multitenant RESTful APIs based on Warden. It
17
19
 
18
20
  ### Why Cadenero?
19
21
  **"Cadenero"** is the spanish word for ["Bouncer (doorman)"](http://en.wikipedia.org/wiki/Bouncer_(doorman\)). The main function of **Cadenero** is to be a resource for authenticating consumers of the services that the API provides. As the real bouncers, **Cadenero** aims to provide security, check authorized access, to refuse entry for intoxication, aggressive behavior or non-compliance with statutory or establishment rules.
22
+
20
23
  You can use [Warden](https://github.com/hassox/warden) or [Devise](https://github.com/plataformatec/devise) directly but for API apps the rewritting and monkey patching can be messy.
21
24
 
22
25
  ### Installing **Cadenero**
23
26
 
27
+ #### Preconditions
28
+
29
+ ##### Postgresql
30
+ You should have a Postgresql server (for downloading see: http://www.postgresql.org/download/). If you are using OSX, you can install using [Homebrew](http://mxcl.github.io/homebrew/) for that you can follow the following this [instructions](http://www.moncefbelyamani.com/how-to-install-postgresql-on-a-mac-with-homebrew-and-lunchy/)
31
+
32
+ ##### Ruby 1.9.x or 2.x
33
+ For that we recommend that you use [rbenv](https://github.com/sstephenson/rbenv) with [ruby-build](https://github.com/sstephenson/ruby-build) or [rvm](https://rvm.io/)
34
+
35
+ We use the standard `rake`, `bundler` and `gem`
36
+
37
+ ##### Git/Github
38
+ You are here. Then you know what to do ;-)
39
+
40
+ #### Setup
41
+
24
42
  Rails 3.2.13 is the master version used now by **Cadenero**, if you want to use Rails 4 goodness please use the branch "rails4"
25
43
 
26
44
  Generate first your Rails app as usual using:
27
45
 
28
46
  ```
29
- $ rails _3.2.13_ new your_app --skip-test-unit
47
+ $ rails _3.2.13_ new your_app --skip-test-unit -d postgresql
30
48
  ```
31
49
 
32
50
  In the `Gemfile` add the following lines:
33
51
  ```ruby
34
- gem 'cadenero', '~> 0.0.2.b6'
35
- gem 'pg'
52
+ gem 'cadenero', '~> 0.0.2.b7'
53
+
54
+ group :development, :test do
55
+ gem 'rspec-rails', '~> 2.14.0'
56
+ gem 'capybara', '~> 2.1.0'
57
+ gem 'rack-test', '~> 0.6.2'
58
+ end
36
59
  ```
37
60
 
38
61
  In the `config/database.yml` replace the `sqlite3` adapter for `postgresql` as follow:
@@ -40,12 +63,16 @@ In the `config/database.yml` replace the `sqlite3` adapter for `postgresql` as f
40
63
  ```
41
64
  development:
42
65
  adapter: postgresql
66
+ encoding: unicode
43
67
  database: your_app_development
68
+ pool: 5
44
69
  min_messages: warning
45
70
 
46
71
  test:
47
72
  adapter: postgresql
48
- database: your_app_test
73
+ encoding: unicode
74
+ database: your_app_test
75
+ pool: 5
49
76
  min_messages: warning
50
77
  ```
51
78
 
@@ -114,6 +141,15 @@ You can check them running:
114
141
  ```
115
142
  $ rake routes
116
143
  ```
144
+ ### Strategies
145
+ For authentication **Cadenero** has two default Warden Strategies:
146
+ * **Password**. That expect that the client to keep a session cookie and using for authentication the user `email` and `password`.
147
+ * **Token Authentication**. That is stateless and expects that for each request the user include the `auth_token` as a key-value of the request params.
148
+
149
+ In any case when you signed up **Cadenero** creates an auth_token for the membership to the account that you signed up.
150
+
151
+ If you want to know more about Warden Strategies see: https://github.com/hassox/warden/wiki/Strategies
152
+
117
153
  ### Documentation
118
154
  You can review the YARD docs in: http://rubydoc.info/github/AgilTec/cadenero/frames
119
155
 
@@ -135,14 +171,20 @@ If you found a security bug, do *NOT* use the GitHub issue tracker. Send an emai
135
171
 
136
172
  ### Contributing
137
173
 
138
- We hope that you will consider contributing to **Cadenero**. Please read this short overview for some information about how to get started:
174
+ We hope that you will consider contributing to **Cadenero**. You're encouraged to submit pull requests, propose features and discuss issues.
139
175
 
140
- https://github.com/AgilTec/cadenero/Contributing
176
+ * Fork the project
177
+ * Write test for your new feature or a test that reproduces a bug
178
+ * Implement your feature or make a bug fix
179
+ * Commit, push and make a pull request. Bonus points for topic branches.
141
180
 
142
- You will usually want to write tests for your changes using BDD tools as RSpec, Rack::Test and Capybara. To run the test suite, go into **Cadenero**'s top-level directory and run "bundle install" and "rspec". For the tests to pass, you will need to have a Postgresql server running on your system.
181
+ You will usually want to write tests for your changes using BDD tools as RSpec, Rack::Test and Capybara.
182
+
183
+ To run the test suite, go into **Cadenero**'s top-level directory and run `bundle install` and `rspec spec`. For the tests to pass, you will need to have a Postgresql server running on your system.
143
184
 
144
185
  #### Running the Specs
145
- **Cadenero** use [RSpec](https://github.com/rspec/rspec) and [Capybara](https://github.com/jnicklas/capybara). If you want to extend **Cadenero** please fork and clone the repo. To run the specs you only need to do:
186
+ **Cadenero** use [RSpec](https://github.com/rspec/rspec) and [Capybara](https://github.com/jnicklas/capybara). To run the specs you only need to do:
187
+
146
188
  ```
147
189
  $ RAILS_ENV=test bundle exec rake db:create
148
190
  $ RAILS_ENV=test bundle exec rake db:migrate
@@ -157,7 +199,10 @@ You can `binstub` the command bins to avoid writing `bundle exec`. You only need
157
199
 
158
200
  ### Warden
159
201
 
160
- **Cadenero** is based on Warden, which is a general Rack authentication framework created by Daniel Neighman. We encourage you to read more about Warden here: https://github.com/hassox/warden
202
+ **Cadenero** is based on [Warden](https://github.com/hassox/warden), which is a general Rack authentication framework created by Daniel Neighman. We encourage you to read more about Warden here: https://github.com/hassox/warden/wiki
203
+
204
+ #### Devise
205
+ Some code and architectural decisions in **Cadenero** have been inspired for the excellent gem [Devise](https://github.com/plataformatec/devise).
161
206
 
162
207
  ### Rails::API
163
208
 
@@ -30,13 +30,17 @@
30
30
 
31
31
  # Check to see if there is an authenticated user
32
32
  def user_signed_in?
33
+ unless env['action_dispatch.request.parameters']["auth_token"].nil?
34
+ env['warden'].logout(:user)
35
+ env['warden'].authenticate(:token_authentication, scope: :user)
36
+ end
33
37
  env['warden'].authenticated?(:user) unless env['warden'].nil?
34
38
  end
35
39
 
36
40
  # it the user is not authenticated returns a 422 and an informative error with the link for sign
37
41
  def authenticate_user!
38
42
  unless user_signed_in?
39
- @errors = %Q{Please sign in. posting the user json credentials as: {"user": {"email": "testy2@example.com", "password": "changeme"}} to /v1/sessions}
43
+ @errors = %Q{Please sign in. posting the user json credentials as: {"user": {"email": "testy2@example.com", "password": "changeme"}} or {"user": {"auth_token": d8Ff8uvupXQfChangeMe}} to /v1/sessions}
40
44
  render json: {errors: @errors, links: "/v1/sessions"}, status: 422
41
45
  end
42
46
  end
@@ -0,0 +1,35 @@
1
+ # Mixin for Models that have an auth_token
2
+ module Cadenero::AuthToken
3
+
4
+ # Generate authentication token unless already exists.
5
+ def ensure_auth_token
6
+ reset_auth_token if auth_token.blank?
7
+ end
8
+
9
+ # Generate authentication token unless already exists and save the record.
10
+ def ensure_auth_token!
11
+ reset_auth_token! if auth_token.blank?
12
+ end
13
+
14
+ # Generate new authentication token (a.k.a. "single access token").
15
+ def reset_auth_token
16
+ self.auth_token = generate_token(:auth_token)
17
+ end
18
+
19
+ # Generate new authentication token and save the record.
20
+ def reset_auth_token!
21
+ reset_auth_token
22
+ save(:validate => false)
23
+ end
24
+
25
+ protected
26
+ # Generate a token by looping and ensuring does not already exist.
27
+ # @param [String] column is the name of the column that has the authentication token
28
+ # @return {String]} a unique generated auth_token
29
+ def generate_token(column)
30
+ loop do
31
+ token = SecureRandom.base64(15).tr('+/=lIO0', 'pqrsxyz')
32
+ break token unless self.class.where({ column => token }).first
33
+ end
34
+ end
35
+ end
@@ -1,50 +1,12 @@
1
1
  module Cadenero
2
2
  # Defines that a Cadenero::User is member of an Cadenero::V1::Account
3
3
  class Member < ActiveRecord::Base
4
+ include Cadenero::AuthToken
4
5
  attr_accessible :account_id, :user_id
5
6
  belongs_to :account, :class_name => "Cadenero::V1::Account"
6
7
  belongs_to :user, :class_name => "Cadenero::User"
7
8
  after_create :ensure_auth_token!
8
9
 
9
- # Generate authentication token unless already exists.
10
- def ensure_auth_token
11
- reset_auth_token if auth_token.blank?
12
- end
13
-
14
- # Generate authentication token unless already exists and save the record.
15
- def ensure_auth_token!
16
- reset_auth_token! if auth_token.blank?
17
- end
18
-
19
- # Generate new authentication token (a.k.a. "single access token").
20
- def reset_auth_token
21
- self.auth_token = self.class.auth_token
22
- end
23
-
24
- # Generate new authentication token and save the record.
25
- def reset_auth_token!
26
- reset_auth_token
27
- save(:validate => false)
28
- end
29
-
30
- class << self
31
- # Generate a token checking if one does not already exist in the database.
32
- def auth_token
33
- generate_token(:auth_token)
34
- end
35
-
36
- protected
37
- # Generate a token by looping and ensuring does not already exist.
38
- # @param [String] column is the name of the column that has the authentication token
39
- # @return {String]} a unique generated auth_token
40
- def generate_token(column)
41
- loop do
42
- token = SecureRandom.base64(15).tr('+/=lIO0', 'pqrsxyz')
43
- break token unless Member.where({ column => token }).first
44
- end
45
- end
46
- end
47
-
48
10
  end
49
11
 
50
12
  end
@@ -7,10 +7,9 @@ module Cadenero
7
7
  has_many :members, class_name: "Cadenero::Member"
8
8
  has_many :memberships, through: :members, source: :account
9
9
 
10
- # Obtain the authentication_token from the members to be use for the User
10
+ # Map the auth_tokens for each account that the User is memeber
11
11
  def auth_token
12
12
  members.map{|member| member.auth_token}
13
13
  end
14
-
15
14
  end
16
15
  end
@@ -1,6 +1,7 @@
1
1
  module Cadenero::V1
2
2
  # Defines a subdomain with a default admin (owner) as a tenant in the Rails App
3
3
  class Account < ActiveRecord::Base
4
+ include Cadenero::AuthToken
4
5
  belongs_to :owner, :class_name => "Cadenero::User"
5
6
  has_many :members, :class_name => "Cadenero::Member"
6
7
  has_many :users, :through => :members, :class_name => "Cadenero::User"
@@ -9,7 +10,7 @@ module Cadenero::V1
9
10
  attr_accessible :name, :subdomain, :owner_attributes, :owner
10
11
  validates :subdomain, :presence => true, :uniqueness => true
11
12
  validates :owner, :presence => true
12
- after_create :ensure_authentication_token!
13
+ after_create :ensure_auth_token!
13
14
 
14
15
  # Creates an account and assign the provided [Cadenero::User] as owner to the account
15
16
  # @param [Hash] params list
@@ -24,7 +25,7 @@ module Cadenero::V1
24
25
  if account.save
25
26
  account.users << account.owner
26
27
  account.create_schema
27
- account.ensure_authentication_token!
28
+ account.ensure_auth_token!
28
29
  end
29
30
  account
30
31
  end
@@ -48,49 +49,5 @@ module Cadenero::V1
48
49
  Apartment::Database.create(subdomain)
49
50
  end
50
51
 
51
- # Obtain the auth_token from the members to be use for the Account
52
- def auth_token
53
- members.map{|member| member.auth_token}
54
- end
55
-
56
- # Generate authentication token unless already exists.
57
- def ensure_authentication_token
58
- reset_authentication_token if authentication_token.blank?
59
- end
60
-
61
- # Generate authentication token unless already exists and save the record.
62
- def ensure_authentication_token!
63
- reset_authentication_token! if authentication_token.blank?
64
- end
65
-
66
- # Generate new authentication token (a.k.a. "single access token").
67
- def reset_authentication_token
68
- self.authentication_token = self.class.authentication_token
69
- end
70
-
71
- # Generate new authentication token and save the record.
72
- def reset_authentication_token!
73
- reset_authentication_token
74
- save(:validate => false)
75
- end
76
-
77
- class << self
78
- # Generate a token checking if one does not already exist in the database.
79
- def authentication_token
80
- generate_token(:authentication_token)
81
- end
82
-
83
- protected
84
- # Generate a token by looping and ensuring does not already exist.
85
- # @param [String] column is the name of the column that has the authentication token
86
- # @return {String]} a unique generated authentication_token
87
- def generate_token(column)
88
- loop do
89
- token = SecureRandom.base64(15).tr('+/=lIO0', 'pqrsxyz')
90
- break token unless Account.where({ column => token }).first
91
- end
92
- end
93
- end
94
-
95
52
  end
96
53
  end
@@ -9,4 +9,6 @@ Apartment.configure do |config|
9
9
  "Cadenero::User"]
10
10
  # Dynamically get database names to migrate
11
11
  # config.database_names = lambda{ Account.pluck(:database_name) }
12
- end
12
+ end
13
+
14
+ Apartment.database_names = lambda{ Cadenero::V1::Account.pluck(:subdomain)}
@@ -0,0 +1,35 @@
1
+ Warden::Strategies.add(:token_authentication) do
2
+ def subdomain
3
+ ActionDispatch::Http::URL.extract_subdomains(request.host, 1)
4
+ end
5
+
6
+ def json_params
7
+ unless params.empty?
8
+ params
9
+ else
10
+ @json ||= env['rack.input'].gets
11
+ JSON.parse(@json)
12
+ end
13
+ end
14
+
15
+ def valid?
16
+ subdomain.present? && json_params["auth_token"]
17
+ end
18
+
19
+ def authenticate!
20
+ account = Cadenero::V1::Account.get_by_subdomain(subdomain)
21
+ if account
22
+ member = account.members.where(auth_token: json_params["auth_token"]).first
23
+ u = nil
24
+ u = member.user unless member.nil?
25
+ if u.nil? || u.blank?
26
+ fail!
27
+ else
28
+ env['warden'].set_user(u.id, :scope => :user)
29
+ success!(u)
30
+ end
31
+ else
32
+ fail!
33
+ end
34
+ end
35
+ end
@@ -1,4 +1,4 @@
1
1
  Rails.application.config.middleware.use Warden::Manager do |manager|
2
2
  manager.failure_app = Cadenero::V1::Account::DashboardController.action(:index)
3
- manager.default_strategies :password
3
+ manager.default_strategies :password, :token_authentication
4
4
  end
@@ -3,12 +3,12 @@ class CreateCadeneroV1Accounts < ActiveRecord::Migration
3
3
  create_table :cadenero_accounts do |t|
4
4
  t.string :name
5
5
  t.string :subdomain
6
- t.string :authentication_token
6
+ t.string :auth_token
7
7
  t.references :owner
8
8
 
9
9
  t.timestamps
10
10
  end
11
11
  add_index :cadenero_accounts, :owner_id
12
- add_index :cadenero_accounts, :authentication_token
12
+ add_index :cadenero_accounts, :auth_token
13
13
  end
14
14
  end
@@ -46,7 +46,7 @@ module Cadenero
46
46
  # Expect that the JSON response will be a default error message when the user has not signed in yet
47
47
  # the errors_redirect_ro_sign_in is defined if was not previously defined is a Spec
48
48
  def check_error_for_not_signed_in_yet
49
- errors_redirect_ro_sign_in ||= {errors: %Q{Please sign in. posting the user json credentials as: {"user": {"email": "testy2@example.com", "password": "changeme"}} to /v1/sessions}, links: "/v1/sessions"}.to_json
49
+ errors_redirect_ro_sign_in ||= {errors: %Q{Please sign in. posting the user json credentials as: {"user": {"email": "testy2@example.com", "password": "changeme"}} or {"user": {"auth_token": d8Ff8uvupXQfChangeMe}} to /v1/sessions}, links: "/v1/sessions"}.to_json
50
50
  get cadenero.v1_root_url(:subdomain => account.subdomain)
51
51
  expected_json_errors(errors_redirect_ro_sign_in)
52
52
  end
@@ -73,23 +73,23 @@ module Cadenero
73
73
  # @param [Integer] http_code Optional expected returned HTTP Code from last_response
74
74
  def expect_subject_ids_to_have(subject, ids_key, ids_values, http_code=201)
75
75
  expect(last_response.status).to eq http_code
76
- expect(json_last_response_body[subject][ids_key]).to eq ids_values
76
+ expect(json_last_response_body[subject][ids_key].sort).to eq ids_values.sort
77
77
  end
78
78
 
79
- # Expect that a owner sign in successfuly to one of his accounts
79
+ # Expect that a owner sign in successfuly to one of his accounts creating a session
80
80
  # @param [Cadenero::V1::Account] account
81
81
  # @return [String] email for the last response user
82
- def successful_sign_in_owner(account)
82
+ def successful_sign_in_owner_with_session(account)
83
83
  sign_in_user sessions_url, account_user_params_json(account.owner)
84
84
  expect_subject_ids_to_have("user", "account_ids", [account.id])
85
- expect_auth_token("user", account.auth_token)
85
+ expect_auth_token("user", account.owner.auth_token)
86
86
  return json_last_response_body["user"]["email"]
87
87
  end
88
88
 
89
89
  # Expect that a user sign in successfuly to an account
90
90
  # @param [Cadenero::V1::Account] account
91
91
  # @return [String] email for the last response user
92
- def successful_sign_in_user(account, user)
92
+ def successful_sign_in_user_with_session(account, user)
93
93
  sign_in_user sessions_url, user
94
94
  expect_subject_ids_to_have("user", "membership_ids", [account.id])
95
95
  return json_last_response_body["user"]["email"]
@@ -98,7 +98,7 @@ module Cadenero
98
98
  # Expect that a user sign in successfuly to an account
99
99
  # @param [Cadenero::V1::Account] account
100
100
  # @return [String] email for the last response user
101
- def successful_sign_up_user_in_existing_account(account, suffix=nil)
101
+ def successful_sign_up_user_in_existing_account_with_session(account, suffix=nil)
102
102
  url = "http://#{account.subdomain}.example.com/"
103
103
  sign_up_user url, suffix
104
104
  expect(last_request.url).to eq "#{url}v1/users"
@@ -1,3 +1,3 @@
1
1
  module Cadenero
2
- VERSION = "0.0.2.b6" # Current VERSION of Cadenero
2
+ VERSION = "0.0.2.b7" # Current VERSION of Cadenero
3
3
  end
@@ -17,7 +17,7 @@ module Cadenero
17
17
  post :create, format: :json, account: { name: "First Account", subdomain: "first" }, use_route: :cadenero
18
18
  expect(response.status).to eq(201)
19
19
  expect(assigns(:account)).to eq(account)
20
- expect(assigns(:account)[:authentication_token]).to eq(account.authentication_token)
20
+ expect(assigns(:account)[:authentication_token]).to eq(account.auth_token)
21
21
  end
22
22
  end
23
23
 
@@ -5,7 +5,7 @@ module Cadenero
5
5
  let!(:user) { stub_model(Cadenero::User, id: 101, email: "testy@example.com", password: "12345678")}
6
6
  let!(:account) { stub_model(Cadenero::V1::Account, id: 1001, authentication_token: "dsdaefer412add",
7
7
  owner: user) }
8
- let(:errors_redirect_ro_sign_in) {%Q{Please sign in. posting the user json credentials as: {"user": {"email": "testy2@example.com", "password": "changeme"}} to /v1/sessions}}
8
+ let(:errors_redirect_ro_sign_in) {%Q{Please sign in. posting the user json credentials as: {"user": {"email": "testy2@example.com", "password": "changeme"}} or {"user": {"auth_token": d8Ff8uvupXQfChangeMe}} to /v1/sessions}}
9
9
 
10
10
 
11
11
  context "User signed out" do
@@ -16,20 +16,20 @@ ActiveRecord::Schema.define(:version => 20130715174857) do
16
16
  create_table "cadenero_accounts", :force => true do |t|
17
17
  t.string "name"
18
18
  t.string "subdomain"
19
- t.string "authentication_token"
19
+ t.string "auth_token"
20
20
  t.integer "owner_id"
21
- t.datetime "created_at", :null => false
22
- t.datetime "updated_at", :null => false
21
+ t.datetime "created_at"
22
+ t.datetime "updated_at"
23
23
  end
24
24
 
25
- add_index "cadenero_accounts", ["authentication_token"], :name => "index_cadenero_accounts_on_authentication_token"
25
+ add_index "cadenero_accounts", ["auth_token"], :name => "index_cadenero_accounts_on_auth_token"
26
26
  add_index "cadenero_accounts", ["owner_id"], :name => "index_cadenero_accounts_on_owner_id"
27
27
 
28
28
  create_table "cadenero_members", :force => true do |t|
29
29
  t.integer "account_id"
30
30
  t.integer "user_id"
31
- t.datetime "created_at", :null => false
32
- t.datetime "updated_at", :null => false
31
+ t.datetime "created_at"
32
+ t.datetime "updated_at"
33
33
  t.string "auth_token"
34
34
  end
35
35
 
@@ -40,8 +40,8 @@ ActiveRecord::Schema.define(:version => 20130715174857) do
40
40
  create_table "cadenero_users", :force => true do |t|
41
41
  t.string "email"
42
42
  t.string "password_digest"
43
- t.datetime "created_at", :null => false
44
- t.datetime "updated_at", :null => false
43
+ t.datetime "created_at"
44
+ t.datetime "updated_at"
45
45
  end
46
46
 
47
47
  end
@@ -5,4 +5,4 @@
5
5
  password_confirmation: '12345678'))
6
6
 
7
7
  @account.create_schema
8
- @account.ensure_authentication_token!
8
+ @account.ensure_auth_token!
@@ -370,3 +370,40 @@ Processing by Cadenero::V1::Account::DashboardController#index as HTML
370
370
  Parameters: {"default"=>:json}
371
371
  Filter chain halted as :authenticate_user! rendered or redirected
372
372
  Completed 422 Unprocessable Entity in 5ms (Views: 0.3ms | ActiveRecord: 0.0ms)
373
+ Connecting to database specified by database.yml
374
+  (7.2ms) CREATE TABLE "schema_migrations" ("version" character varying(255) NOT NULL) 
375
+  (1.9ms) CREATE UNIQUE INDEX "unique_schema_migrations" ON "schema_migrations" ("version")
376
+  (0.2ms) SELECT "schema_migrations"."version" FROM "schema_migrations" 
377
+ Migrating to CreateCadeneroV1Accounts (20130612061604)
378
+  (0.1ms) BEGIN
379
+  (6.7ms) CREATE TABLE "cadenero_accounts" ("id" serial primary key, "name" character varying(255), "subdomain" character varying(255), "authentication_token" character varying(255), "owner_id" integer, "created_at" timestamp NOT NULL, "updated_at" timestamp NOT NULL) 
380
+  (0.9ms) CREATE INDEX "index_cadenero_accounts_on_owner_id" ON "cadenero_accounts" ("owner_id")
381
+  (0.8ms) CREATE INDEX "index_cadenero_accounts_on_authentication_token" ON "cadenero_accounts" ("authentication_token")
382
+  (0.5ms) INSERT INTO "schema_migrations" ("version") VALUES ('20130612061604')
383
+  (1.1ms) COMMIT
384
+ Migrating to CreateCadeneroV1Users (20130612064652)
385
+  (0.2ms) BEGIN
386
+  (4.5ms) CREATE TABLE "cadenero_users" ("id" serial primary key, "email" character varying(255), "password_digest" character varying(255), "created_at" timestamp NOT NULL, "updated_at" timestamp NOT NULL) 
387
+  (0.2ms) INSERT INTO "schema_migrations" ("version") VALUES ('20130612064652')
388
+  (0.9ms) COMMIT
389
+ Migrating to CreateCadeneroV1Members (20130612073709)
390
+  (0.2ms) BEGIN
391
+  (4.5ms) CREATE TABLE "cadenero_members" ("id" serial primary key, "account_id" integer, "user_id" integer, "created_at" timestamp NOT NULL, "updated_at" timestamp NOT NULL) 
392
+  (1.4ms) CREATE INDEX "index_cadenero_members_on_account_id" ON "cadenero_members" ("account_id")
393
+  (6.1ms) CREATE INDEX "index_cadenero_members_on_user_id" ON "cadenero_members" ("user_id")
394
+  (0.1ms) INSERT INTO "schema_migrations" ("version") VALUES ('20130612073709')
395
+  (0.8ms) COMMIT
396
+ Migrating to AddAuthTokenToCadeneroMembers (20130715174857)
397
+  (0.2ms) BEGIN
398
+  (9.1ms) ALTER TABLE "cadenero_members" ADD COLUMN "auth_token" character varying(255)
399
+  (1.3ms) CREATE INDEX "index_cadenero_members_on_auth_token" ON "cadenero_members" ("auth_token")
400
+  (0.1ms) INSERT INTO "schema_migrations" ("version") VALUES ('20130715174857')
401
+  (0.5ms) COMMIT
402
+ Migrating to RenameAuthenticationTokenToV1Account (20130717234244)
403
+  (0.1ms) BEGIN
404
+  (0.2ms) ALTER TABLE "cadenero_accounts" RENAME COLUMN "authentication_token" TO "auth_token"
405
+  (1.1ms) CREATE INDEX "index_cadenero_accounts_on_auth_token" ON "cadenero_accounts" ("auth_token")
406
+  (0.6ms) DROP INDEX "index_cadenero_accounts_on_authentication_token"
407
+  (0.1ms) INSERT INTO "schema_migrations" ("version") VALUES ('20130717234244')
408
+  (1.6ms) COMMIT
409
+  (0.2ms) SELECT "schema_migrations"."version" FROM "schema_migrations"