devise-token_authenticatable 0.4.0 → 0.4.6
Sign up to get free protection for your applications and to get access to all the features.
- 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
|