devise-token_authenticatable 0.4.0 → 0.4.6
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 +4 -4
- data/.travis.yml +3 -0
- data/README.md +26 -16
- data/devise-token_authenticatable.gemspec +8 -8
- data/lib/devise/token_authenticatable.rb +7 -0
- data/lib/devise/token_authenticatable/hooks/timeoutable.rb +34 -0
- data/lib/devise/token_authenticatable/model.rb +9 -3
- data/lib/devise/token_authenticatable/version.rb +1 -1
- data/spec/models/devise/token_authenticatable/model_spec.rb +31 -0
- data/spec/requests/devise/token_authenticatable/strategy_spec.rb +6 -6
- data/spec/token_authenticatable_spec.rb +14 -0
- metadata +26 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1a68ab4f5e9ea350298a644299de878c50077a96
|
4
|
+
data.tar.gz: c110e22709365cd6f0861b8703b224f0db7857a4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dbb469bf9f93baa80bc069d2417c1cdca7d2d5ca975085d6b3a963d52cdcb7b99f3edb0b9e7ab8eb7e32e595b86024a23720a518469664023a12fa5f78e9b6e7
|
7
|
+
data.tar.gz: af936ee72ce7019d43cb86f70eeed9c6d11ff0b11cd8a4c825d3ade79112033230a1580039530dbaa23900cbf6c5938c5a2697992f3f295e25976397f32b5bc5
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -28,32 +28,42 @@ Or install it yourself as:
|
|
28
28
|
`~> 0.2` | `~> 3.3.0`
|
29
29
|
`~> 0.3` | `~> 3.4.0`
|
30
30
|
`~> 0.4` | `~> 3.5.0`
|
31
|
+
`~> 0.4.6` | `~> 3.5.2`
|
31
32
|
|
32
33
|
## Usage
|
33
34
|
|
34
35
|
Add `:token_authenticatable` to your devise model:
|
35
36
|
|
36
|
-
|
37
|
-
|
38
|
-
|
37
|
+
```ruby
|
38
|
+
class User < ActiveRecord::Base
|
39
|
+
devise :database_authenticatable, :token_authenticatable
|
40
|
+
end
|
41
|
+
```
|
39
42
|
|
40
43
|
## Configuration
|
41
44
|
|
42
45
|
This gem can be configured as shown in the following:
|
43
46
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
47
|
+
```ruby
|
48
|
+
Devise::TokenAuthenticatable.setup do |config|
|
49
|
+
# enables the expiration of a token after a session timeout,
|
50
|
+
# only useful in connection with the devise timeoutable module,
|
51
|
+
# defaults to false
|
52
|
+
config.expire_auth_token_on_timeout = true
|
53
|
+
|
54
|
+
# set the authentication key name used by this module,
|
55
|
+
# defaults to :auth_token
|
56
|
+
config.token_authentication_key = :other_key_name
|
57
|
+
|
58
|
+
# enable reset of the authentication token before the model is saved,
|
59
|
+
# defaults to false
|
60
|
+
config.should_reset_authentication_token = true
|
61
|
+
|
62
|
+
# enables the setting of the authentication token - if not already - before the model is saved,
|
63
|
+
# defaults to false
|
64
|
+
config.should_ensure_authentication_token = true
|
65
|
+
end
|
66
|
+
```
|
57
67
|
|
58
68
|
## Documentation
|
59
69
|
|
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.version = Devise::TokenAuthenticatable::VERSION.dup
|
9
9
|
spec.platform = Gem::Platform::RUBY
|
10
10
|
spec.authors = ["Sebastian Oelke"]
|
11
|
-
spec.email = ["dev@
|
11
|
+
spec.email = ["dev@soelke.de"]
|
12
12
|
spec.description = %q{This gem provides the extracted Token Authenticatable module of devise.
|
13
13
|
It enables the user to sign in via an authentication token. This token
|
14
14
|
can be given via a query string or HTTP Basic Authentication.}
|
@@ -22,14 +22,14 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.require_paths = ["lib"]
|
23
23
|
|
24
24
|
|
25
|
-
spec.add_dependency "devise", "
|
25
|
+
spec.add_dependency "devise", ">= 3.5.2", "< 4.0.0"
|
26
26
|
|
27
|
-
spec.add_development_dependency "rails", "~> 4.1
|
28
|
-
spec.add_development_dependency "rspec-rails", "~> 3.0
|
29
|
-
spec.add_development_dependency "pry", "~> 0.10
|
30
|
-
spec.add_development_dependency "factory_girl_rails", "~> 4.4
|
31
|
-
spec.add_development_dependency "timecop", "~> 0.7
|
32
|
-
spec.add_development_dependency "bundler", "~> 1.
|
27
|
+
spec.add_development_dependency "rails", "~> 4.1"
|
28
|
+
spec.add_development_dependency "rspec-rails", "~> 3.0"
|
29
|
+
spec.add_development_dependency "pry", "~> 0.10"
|
30
|
+
spec.add_development_dependency "factory_girl_rails", "~> 4.4"
|
31
|
+
spec.add_development_dependency "timecop", "~> 0.7"
|
32
|
+
spec.add_development_dependency "bundler", "~> 1.11"
|
33
33
|
|
34
34
|
# Fix database connection with sqlite3 and jruby
|
35
35
|
if RUBY_ENGINE == 'ruby'
|
@@ -3,6 +3,13 @@ require "devise/token_authenticatable/strategy"
|
|
3
3
|
module Devise
|
4
4
|
module TokenAuthenticatable
|
5
5
|
|
6
|
+
# Authentication token expiration on timeout
|
7
|
+
#
|
8
|
+
# This option is only used if your model uses the Devise
|
9
|
+
# :timeoutable module.
|
10
|
+
mattr_accessor :expire_auth_token_on_timeout
|
11
|
+
@@expire_auth_token_on_timeout = false
|
12
|
+
|
6
13
|
# Authentication token params key name of choice. E.g. /users/sign_in?some_key=...
|
7
14
|
mattr_accessor :token_authentication_key
|
8
15
|
@@token_authentication_key = :auth_token
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# Each time a record is set we check whether its session has already timed out
|
2
|
+
# or not, based on last request time. If so and :expire_auth_token_on_timeout
|
3
|
+
# is set to true, the record's auth token is reset.
|
4
|
+
|
5
|
+
# This is a backport of the functionality of expire_auth_token_on_timeout that
|
6
|
+
# has been removed from devise in version 3.5.2.
|
7
|
+
#
|
8
|
+
# For the original version cf.
|
9
|
+
# https://github.com/plataformatec/devise/blob/v3.5.1/lib/devise/hooks/timeoutable.rb.
|
10
|
+
|
11
|
+
Warden::Manager.after_set_user do |record, warden, options|
|
12
|
+
scope = options[:scope]
|
13
|
+
env = warden.request.env
|
14
|
+
|
15
|
+
if record && record.respond_to?(:timedout?) &&
|
16
|
+
warden.authenticated?(scope) &&
|
17
|
+
options[:store] != false &&
|
18
|
+
!env['devise.skip_timeoutable']
|
19
|
+
|
20
|
+
last_request_at = warden.session(scope)['last_request_at']
|
21
|
+
|
22
|
+
if last_request_at.is_a? Integer
|
23
|
+
last_request_at = Time.at(last_request_at).utc
|
24
|
+
elsif last_request_at.is_a? String
|
25
|
+
last_request_at = Time.parse(last_request_at)
|
26
|
+
end
|
27
|
+
|
28
|
+
if record.timedout?(last_request_at) && !env['devise.skip_timeout']
|
29
|
+
if record.respond_to?(:expire_auth_token_on_timeout) && record.expire_auth_token_on_timeout
|
30
|
+
record.reset_authentication_token!
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'devise/token_authenticatable/hooks/timeoutable'
|
2
|
+
|
1
3
|
module Devise
|
2
4
|
module Models
|
3
5
|
# The +TokenAuthenticatable+ module is responsible for generating an authentication token and
|
@@ -27,6 +29,8 @@ module Devise
|
|
27
29
|
included do
|
28
30
|
before_save :reset_authentication_token_before_save
|
29
31
|
before_save :ensure_authentication_token_before_save
|
32
|
+
|
33
|
+
attr_writer :expire_auth_token_on_timeout
|
30
34
|
end
|
31
35
|
|
32
36
|
module ClassMethods
|
@@ -48,8 +52,6 @@ module Devise
|
|
48
52
|
end
|
49
53
|
end
|
50
54
|
|
51
|
-
Devise::Models.config(self, :expire_auth_token_on_timeout)
|
52
|
-
|
53
55
|
end
|
54
56
|
|
55
57
|
def self.required_fields(klass)
|
@@ -82,7 +84,11 @@ module Devise
|
|
82
84
|
end
|
83
85
|
|
84
86
|
def expire_auth_token_on_timeout
|
85
|
-
|
87
|
+
if @expire_auth_token_on_timeout
|
88
|
+
@expire_auth_token_on_timeout
|
89
|
+
else
|
90
|
+
Devise::TokenAuthenticatable.expire_auth_token_on_timeout
|
91
|
+
end
|
86
92
|
end
|
87
93
|
|
88
94
|
private
|
@@ -39,6 +39,37 @@ shared_examples "token authenticatable" do
|
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
|
+
describe "#expire_auth_token_on_timeout" do
|
43
|
+
let(:entity) { create(described_class.name.underscore.to_sym) }
|
44
|
+
|
45
|
+
context "enabling expire_auth_token_on_timeout first" do
|
46
|
+
|
47
|
+
before :each do
|
48
|
+
entity.expire_auth_token_on_timeout = true
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should be true" do
|
52
|
+
expect(entity.expire_auth_token_on_timeout).to eq true
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should not use the default" do
|
56
|
+
expect(Devise::TokenAuthenticatable).to_not receive(:expire_auth_token_on_timeout)
|
57
|
+
|
58
|
+
entity.expire_auth_token_on_timeout
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
context "not enabling expire_auth_token_on_timeout" do
|
64
|
+
|
65
|
+
it "should use the default" do
|
66
|
+
expect(Devise::TokenAuthenticatable).to receive(:expire_auth_token_on_timeout)
|
67
|
+
|
68
|
+
entity.expire_auth_token_on_timeout
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
end
|
42
73
|
end
|
43
74
|
|
44
75
|
context "class methods" do
|
@@ -137,8 +137,8 @@ describe Devise::Strategies::TokenAuthenticatable do
|
|
137
137
|
context "on sign in" do
|
138
138
|
|
139
139
|
it 'should authenticate the user' do
|
140
|
-
swap Devise::TokenAuthenticatable, token_authentication_key: :secret_token do
|
141
|
-
swap Devise,
|
140
|
+
swap Devise::TokenAuthenticatable, token_authentication_key: :secret_token, expire_auth_token_on_timeout: true do
|
141
|
+
swap Devise, timeout_in: (-1).minute do
|
142
142
|
sign_in_as_new_user_with_token
|
143
143
|
expect(warden).to be_authenticated(:user)
|
144
144
|
end
|
@@ -150,8 +150,8 @@ describe Devise::Strategies::TokenAuthenticatable do
|
|
150
150
|
context "on re-sign in" do
|
151
151
|
|
152
152
|
it 'should not authenticate the user' do
|
153
|
-
swap Devise::TokenAuthenticatable, token_authentication_key: :secret_token do
|
154
|
-
swap Devise,
|
153
|
+
swap Devise::TokenAuthenticatable, token_authentication_key: :secret_token, expire_auth_token_on_timeout: true do
|
154
|
+
swap Devise, timeout_in: (-1).minute do
|
155
155
|
user = sign_in_as_new_user_with_token
|
156
156
|
token = user.authentication_token
|
157
157
|
|
@@ -162,8 +162,8 @@ describe Devise::Strategies::TokenAuthenticatable do
|
|
162
162
|
end
|
163
163
|
|
164
164
|
it 'should reset the authentication token' do
|
165
|
-
swap Devise::TokenAuthenticatable, token_authentication_key: :secret_token do
|
166
|
-
swap Devise,
|
165
|
+
swap Devise::TokenAuthenticatable, token_authentication_key: :secret_token, expire_auth_token_on_timeout: true do
|
166
|
+
swap Devise, timeout_in: (-1).minute do
|
167
167
|
user = sign_in_as_new_user_with_token
|
168
168
|
token = user.authentication_token
|
169
169
|
|
@@ -2,6 +2,20 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Devise::TokenAuthenticatable do
|
4
4
|
|
5
|
+
context "configuring the expire_auth_token_on_timeout" do
|
6
|
+
let(:expire_auth_token_on_timeout) { true }
|
7
|
+
|
8
|
+
it "should set the configuration" do
|
9
|
+
expect {
|
10
|
+
Devise::TokenAuthenticatable.setup do |config|
|
11
|
+
config.expire_auth_token_on_timeout = expire_auth_token_on_timeout
|
12
|
+
end
|
13
|
+
}.to change {
|
14
|
+
Devise::TokenAuthenticatable.expire_auth_token_on_timeout
|
15
|
+
}.from(false).to(expire_auth_token_on_timeout)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
5
19
|
context "configuring the token_authentication_key" do
|
6
20
|
let(:new_key) { :other_key }
|
7
21
|
|
metadata
CHANGED
@@ -1,113 +1,119 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: devise-token_authenticatable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sebastian Oelke
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-03-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: devise
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 3.5.2
|
20
|
+
- - "<"
|
18
21
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
22
|
+
version: 4.0.0
|
20
23
|
type: :runtime
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
24
|
-
- - "
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 3.5.2
|
30
|
+
- - "<"
|
25
31
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
32
|
+
version: 4.0.0
|
27
33
|
- !ruby/object:Gem::Dependency
|
28
34
|
name: rails
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
30
36
|
requirements:
|
31
37
|
- - "~>"
|
32
38
|
- !ruby/object:Gem::Version
|
33
|
-
version: 4.1
|
39
|
+
version: '4.1'
|
34
40
|
type: :development
|
35
41
|
prerelease: false
|
36
42
|
version_requirements: !ruby/object:Gem::Requirement
|
37
43
|
requirements:
|
38
44
|
- - "~>"
|
39
45
|
- !ruby/object:Gem::Version
|
40
|
-
version: 4.1
|
46
|
+
version: '4.1'
|
41
47
|
- !ruby/object:Gem::Dependency
|
42
48
|
name: rspec-rails
|
43
49
|
requirement: !ruby/object:Gem::Requirement
|
44
50
|
requirements:
|
45
51
|
- - "~>"
|
46
52
|
- !ruby/object:Gem::Version
|
47
|
-
version: 3.0
|
53
|
+
version: '3.0'
|
48
54
|
type: :development
|
49
55
|
prerelease: false
|
50
56
|
version_requirements: !ruby/object:Gem::Requirement
|
51
57
|
requirements:
|
52
58
|
- - "~>"
|
53
59
|
- !ruby/object:Gem::Version
|
54
|
-
version: 3.0
|
60
|
+
version: '3.0'
|
55
61
|
- !ruby/object:Gem::Dependency
|
56
62
|
name: pry
|
57
63
|
requirement: !ruby/object:Gem::Requirement
|
58
64
|
requirements:
|
59
65
|
- - "~>"
|
60
66
|
- !ruby/object:Gem::Version
|
61
|
-
version: 0.10
|
67
|
+
version: '0.10'
|
62
68
|
type: :development
|
63
69
|
prerelease: false
|
64
70
|
version_requirements: !ruby/object:Gem::Requirement
|
65
71
|
requirements:
|
66
72
|
- - "~>"
|
67
73
|
- !ruby/object:Gem::Version
|
68
|
-
version: 0.10
|
74
|
+
version: '0.10'
|
69
75
|
- !ruby/object:Gem::Dependency
|
70
76
|
name: factory_girl_rails
|
71
77
|
requirement: !ruby/object:Gem::Requirement
|
72
78
|
requirements:
|
73
79
|
- - "~>"
|
74
80
|
- !ruby/object:Gem::Version
|
75
|
-
version: 4.4
|
81
|
+
version: '4.4'
|
76
82
|
type: :development
|
77
83
|
prerelease: false
|
78
84
|
version_requirements: !ruby/object:Gem::Requirement
|
79
85
|
requirements:
|
80
86
|
- - "~>"
|
81
87
|
- !ruby/object:Gem::Version
|
82
|
-
version: 4.4
|
88
|
+
version: '4.4'
|
83
89
|
- !ruby/object:Gem::Dependency
|
84
90
|
name: timecop
|
85
91
|
requirement: !ruby/object:Gem::Requirement
|
86
92
|
requirements:
|
87
93
|
- - "~>"
|
88
94
|
- !ruby/object:Gem::Version
|
89
|
-
version: 0.7
|
95
|
+
version: '0.7'
|
90
96
|
type: :development
|
91
97
|
prerelease: false
|
92
98
|
version_requirements: !ruby/object:Gem::Requirement
|
93
99
|
requirements:
|
94
100
|
- - "~>"
|
95
101
|
- !ruby/object:Gem::Version
|
96
|
-
version: 0.7
|
102
|
+
version: '0.7'
|
97
103
|
- !ruby/object:Gem::Dependency
|
98
104
|
name: bundler
|
99
105
|
requirement: !ruby/object:Gem::Requirement
|
100
106
|
requirements:
|
101
107
|
- - "~>"
|
102
108
|
- !ruby/object:Gem::Version
|
103
|
-
version: '1.
|
109
|
+
version: '1.11'
|
104
110
|
type: :development
|
105
111
|
prerelease: false
|
106
112
|
version_requirements: !ruby/object:Gem::Requirement
|
107
113
|
requirements:
|
108
114
|
- - "~>"
|
109
115
|
- !ruby/object:Gem::Version
|
110
|
-
version: '1.
|
116
|
+
version: '1.11'
|
111
117
|
- !ruby/object:Gem::Dependency
|
112
118
|
name: sqlite3
|
113
119
|
requirement: !ruby/object:Gem::Requirement
|
@@ -127,7 +133,7 @@ description: |-
|
|
127
133
|
It enables the user to sign in via an authentication token. This token
|
128
134
|
can be given via a query string or HTTP Basic Authentication.
|
129
135
|
email:
|
130
|
-
- dev@
|
136
|
+
- dev@soelke.de
|
131
137
|
executables: []
|
132
138
|
extensions: []
|
133
139
|
extra_rdoc_files: []
|
@@ -141,6 +147,7 @@ files:
|
|
141
147
|
- devise-token_authenticatable.gemspec
|
142
148
|
- lib/devise-token_authenticatable.rb
|
143
149
|
- lib/devise/token_authenticatable.rb
|
150
|
+
- lib/devise/token_authenticatable/hooks/timeoutable.rb
|
144
151
|
- lib/devise/token_authenticatable/model.rb
|
145
152
|
- lib/devise/token_authenticatable/strategy.rb
|
146
153
|
- lib/devise/token_authenticatable/version.rb
|