devise-authy 1.10.0 → 2.2.0
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/.gitignore +5 -4
- data/.rspec +1 -0
- data/.travis.yml +8 -3
- data/Appraisals +21 -0
- data/CHANGELOG.md +80 -2
- data/Gemfile +0 -23
- data/README.md +90 -20
- data/app/controllers/devise/devise_authy_controller.rb +63 -22
- data/app/controllers/devise_authy/passwords_controller.rb +18 -0
- data/app/views/devise/verify_authy.html.erb +5 -4
- data/app/views/devise/verify_authy.html.haml +4 -3
- data/app/views/devise/verify_authy_installation.html.erb +11 -3
- data/app/views/devise/verify_authy_installation.html.haml +9 -1
- data/config.ru +9 -0
- data/config/locales/en.yml +3 -0
- data/devise-authy.gemspec +22 -12
- data/gemfiles/.bundle/config +2 -0
- data/gemfiles/rails_5_2.gemfile +15 -0
- data/gemfiles/rails_6.gemfile +15 -0
- data/lib/devise-authy.rb +4 -1
- data/lib/devise-authy/controllers/helpers.rb +5 -5
- data/lib/devise-authy/mapping.rb +7 -0
- data/lib/devise-authy/models/authy_authenticatable.rb +1 -1
- data/lib/devise-authy/routes.rb +2 -2
- data/lib/devise-authy/version.rb +1 -1
- data/lib/generators/active_record/devise_authy_generator.rb +3 -3
- data/lib/generators/devise_authy/devise_authy_generator.rb +4 -2
- data/lib/generators/devise_authy/install_generator.rb +9 -5
- metadata +164 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e9332df09a8a1b3e1a71ff775f2cccc75c573123eccb8a6830454cdc3ef3834d
|
4
|
+
data.tar.gz: a0e4f00b59ece3eefe9fee9c04c51227216e13f241ac24afe94c4ec361416443
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3d00cb1eb54d0169277b2e514431bb121f8c5e2dc6a565e07786a4866a29904b301a3730cdbff201f48d1ba5afb4c8b10249b75e9c8ab45da8a0022b9b1f64f9
|
7
|
+
data.tar.gz: 54596845d7b20034aa433497281d74135886f59828e9ae8026ae9fc43f0cfe2b4874cd90c4d69f8295ff76bc02ac7eaadb077fd53d1281354f7a3aa113dac65e
|
data/.gitignore
CHANGED
@@ -31,14 +31,15 @@ build/
|
|
31
31
|
Gemfile.lock
|
32
32
|
.ruby-version
|
33
33
|
.ruby-gemset
|
34
|
+
gemfiles/*.lock
|
34
35
|
|
35
36
|
# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
|
36
37
|
.rvmrc
|
37
38
|
|
38
|
-
|
39
|
-
|
40
|
-
spec/rails-app/log
|
41
|
-
*.sqlite3DS_Store
|
39
|
+
**/*.sqlite
|
40
|
+
**/*.log
|
42
41
|
|
43
42
|
initializers/authy.rb
|
44
43
|
.byebug_history
|
44
|
+
|
45
|
+
.rspec_status
|
data/.rspec
CHANGED
data/.travis.yml
CHANGED
@@ -1,12 +1,17 @@
|
|
1
1
|
language: ruby
|
2
|
-
before_install: cd spec/rails-app && bundle install
|
3
2
|
script: bundle exec rspec
|
4
3
|
rvm:
|
4
|
+
- 2.7
|
5
|
+
- 2.6
|
5
6
|
- 2.5
|
6
7
|
- 2.4
|
7
|
-
- 2.3
|
8
|
-
- 2.2
|
9
8
|
- ruby-head
|
9
|
+
gemfile:
|
10
|
+
- gemfiles/rails_5_2.gemfile
|
11
|
+
- gemfiles/rails_6.gemfile
|
10
12
|
matrix:
|
11
13
|
allow_failures:
|
12
14
|
- rvm: ruby-head
|
15
|
+
exclude:
|
16
|
+
- rvm: 2.4
|
17
|
+
gemfile: gemfiles/rails_6.gemfile
|
data/Appraisals
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
appraise "rails-5-2" do
|
2
|
+
gem "rails", "~> 5.2.0"
|
3
|
+
gem "sqlite3", "~> 1.3.13"
|
4
|
+
|
5
|
+
group :development, :test do
|
6
|
+
gem 'factory_girl_rails', :require => false
|
7
|
+
gem 'rspec-rails', "~>4.0.0.beta3", :require => false
|
8
|
+
gem 'database_cleaner', :require => false
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
appraise "rails-6" do
|
13
|
+
gem "rails", "~> 6.0.0"
|
14
|
+
gem "sqlite3", "~> 1.4"
|
15
|
+
|
16
|
+
group :development, :test do
|
17
|
+
gem 'factory_girl_rails', :require => false
|
18
|
+
gem 'rspec-rails', "~>4.0.0.beta3", :require => false
|
19
|
+
gem 'database_cleaner', :require => false
|
20
|
+
end
|
21
|
+
end if RUBY_VERSION.to_f >= 2.5
|
data/CHANGELOG.md
CHANGED
@@ -9,49 +9,127 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|
9
9
|
|
10
10
|
...
|
11
11
|
|
12
|
+
## [2.2.0] - 2020-06-04
|
13
|
+
|
14
|
+
### Fixed
|
15
|
+
|
16
|
+
- Don't delete user in Authy if another user has the same authy_id (#144)
|
17
|
+
|
18
|
+
## [2.1.0] - 2020-05-05
|
19
|
+
|
20
|
+
### Added
|
21
|
+
|
22
|
+
- Support for generic authenticator tokens (#141)
|
23
|
+
|
24
|
+
### Fixed
|
25
|
+
|
26
|
+
- Can remember device when enabling 2FA for the first time (#139)
|
27
|
+
|
28
|
+
## [2.0.0] - 2020-04-28
|
29
|
+
|
30
|
+
Releasing this as version 2 because there is a significant change in dependencies. Minimum version of Rails is now 5 and of Devise is now 4. Otherwise the gem should work as before.
|
31
|
+
|
32
|
+
### Added
|
33
|
+
|
34
|
+
- HTTP Only flag to remember_device cookie (#116 thanks @agronv)
|
35
|
+
- Remembers device when user logs in with One Touch (#128 thanks @cplopez4)
|
36
|
+
- Autocomplete attributes for HTML form (#130)
|
37
|
+
|
38
|
+
### Changed
|
39
|
+
|
40
|
+
- Mocked API calls in test suite (#123)
|
41
|
+
- Full test suite refactor (#124)
|
42
|
+
- Increased required version for Devise and Rails (#125)
|
43
|
+
- Stopped calling `signed_in?` before it is needed (#126)
|
44
|
+
|
45
|
+
### Fixes
|
46
|
+
|
47
|
+
- Remembers user correctly when logging in with One Touch (#129)
|
48
|
+
|
49
|
+
## [1.11.1] - 2019-02-02
|
50
|
+
|
51
|
+
### Fixed
|
52
|
+
|
53
|
+
- Using the version before loading it broke everything. :facepalm:
|
54
|
+
|
55
|
+
## [1.11.0] - 2019-02-01
|
56
|
+
|
57
|
+
### Fixed
|
58
|
+
|
59
|
+
- Corrects for label in verify_authy view (#103 thanks @mstruebing)
|
60
|
+
- Corrects heading in verify_authy view (#104 thanks @mstruebing)
|
61
|
+
|
62
|
+
### Changed
|
63
|
+
|
64
|
+
- Allows you to define paths for request_sms and request_phone_call (#108 thanks @dedene)
|
65
|
+
|
66
|
+
### Added
|
67
|
+
|
68
|
+
- Now sets a distinct user agent through the Authy gem (#110)
|
69
|
+
|
12
70
|
## [1.10.0] - 2018-09-26
|
13
71
|
|
14
72
|
### Changed
|
73
|
+
|
15
74
|
- Moves OneTouch approval request copy to locale file.
|
16
75
|
|
17
76
|
### Removed
|
77
|
+
|
18
78
|
- Demo app now lives in its own repo
|
19
79
|
|
20
80
|
## [1.9.0] - 2018-09-04
|
21
81
|
|
22
82
|
### Fixed
|
83
|
+
|
23
84
|
- Generated migration now includes version number for Rails 5
|
24
85
|
|
25
86
|
### Changed
|
87
|
+
|
26
88
|
- Removes Jeweler in favour of administering the gemspec by hand
|
27
89
|
- Removes demo app files from gem package
|
28
90
|
|
29
91
|
## [1.8.3] - 2018-07-05
|
92
|
+
|
30
93
|
### Fixed
|
94
|
+
|
31
95
|
- Fixes Ruby interpolation in HAML for onetouch (thanks @muan)
|
32
96
|
- Records Authy authentication after install verification (thanks @nukturnal)
|
33
97
|
- Forgets remember device cookie when disabling Authy (thanks @senekis)
|
34
98
|
|
35
99
|
### Changed
|
100
|
+
|
36
101
|
- Updated testing Rubies in CI
|
37
102
|
|
38
103
|
## Older releases
|
39
104
|
|
40
|
-
|
105
|
+
**_The following releases happened before the changelog was started. Some history will be added for clarity._**
|
41
106
|
|
42
107
|
## [1.8.2] - 2017-12-22
|
108
|
+
|
43
109
|
## [1.8.1] - 2016-12-06
|
110
|
+
|
44
111
|
## [1.8.0] - 2016-10-25
|
112
|
+
|
45
113
|
## [1.7.0] - 2015-12-22
|
114
|
+
|
46
115
|
## [1.6.0] - 2015-01-07
|
116
|
+
|
47
117
|
## [1.5.3] - 2014-06-11
|
118
|
+
|
48
119
|
## [1.5.2] - 2014-06-11
|
120
|
+
|
49
121
|
## [1.5.1] - 2014-04-24
|
122
|
+
|
50
123
|
## [1.5.0] - 2014-01-07
|
124
|
+
|
51
125
|
## [1.4.0] - 2013-12-17
|
126
|
+
|
52
127
|
## [1.3.0] - 2013-11-16
|
128
|
+
|
53
129
|
## [1.2.2] - 2013-09-04
|
130
|
+
|
54
131
|
## [1.2.1] - 2013-04-22
|
132
|
+
|
55
133
|
## [1.2.0] - 2013-04-22 [YANKED]
|
56
|
-
## [1.0.0] - 2013-04-10
|
57
134
|
|
135
|
+
## [1.0.0] - 2013-04-10
|
data/Gemfile
CHANGED
@@ -2,28 +2,5 @@ source 'https://rubygems.org'
|
|
2
2
|
|
3
3
|
gemspec
|
4
4
|
|
5
|
-
group :test do
|
6
|
-
gem 'rails', '~> 4.2.7'
|
7
|
-
gem 'sqlite3'
|
8
|
-
|
9
|
-
# Use SCSS for stylesheets
|
10
|
-
gem 'sass-rails', '~> 5.0'
|
11
|
-
|
12
|
-
# Use Uglifier as compressor for JavaScript assets
|
13
|
-
gem 'uglifier', '>= 1.3.0'
|
14
|
-
|
15
|
-
# Use CoffeeScript for .coffee assets and views
|
16
|
-
gem 'coffee-rails', '~> 4.1.0'
|
17
|
-
|
18
|
-
# Use jquery as the JavaScript library
|
19
|
-
gem 'jquery-rails'
|
20
|
-
|
21
|
-
gem 'launchy'
|
22
|
-
gem 'rspec-rails'
|
23
|
-
gem 'database_cleaner'
|
24
|
-
gem 'capybara'
|
25
|
-
gem 'test-unit'
|
26
|
-
end
|
27
|
-
|
28
5
|
# bundle exec rake doc:rails generates the API under doc/api.
|
29
6
|
gem 'sdoc', '~> 0.4.0', group: :doc
|
data/README.md
CHANGED
@@ -1,10 +1,28 @@
|
|
1
1
|
# Authy Devise [](https://travis-ci.org/twilio/authy-devise)
|
2
2
|
|
3
|
-
This is a [Devise](https://github.com/plataformatec/devise) extension to add Two-Factor Authentication with Authy to your
|
3
|
+
This is a [Devise](https://github.com/plataformatec/devise) extension to add [Two-Factor Authentication with Authy](https://www.twilio.com/docs/authy) to your Rails application.
|
4
|
+
|
5
|
+
* [Pre-requisites](#pre-requisites)
|
6
|
+
* [Demo](#demo)
|
7
|
+
* [Getting started](#getting-started)
|
8
|
+
* [Configuring Models](#configuring-models)
|
9
|
+
* [With the generator](#with-the-generator)
|
10
|
+
* [Manually](#manually)
|
11
|
+
* [Final steps](#final-steps)
|
12
|
+
* [Custom Views](#custom-views)
|
13
|
+
* [Request a phone call](#request-a-phone-call)
|
14
|
+
* [Custom Redirect Paths (eg. using modules)](#custom-redirect-paths-eg-using-modules)
|
15
|
+
* [I18n](#i18n)
|
16
|
+
* [Session variables](#session-variables)
|
17
|
+
* [OneTouch support](#onetouch-support)
|
18
|
+
* [Generic authenticator token support](#generic-authenticator-token-support)
|
19
|
+
* [Rails 5 CSRF protection](#rails-5-csrf-protection)
|
20
|
+
* [Running Tests](#running-tests)
|
21
|
+
* [Copyright](#copyright)
|
4
22
|
|
5
23
|
## Pre-requisites
|
6
24
|
|
7
|
-
To use the Authy API you will need a Twilio Account, [sign up for a free account here](https://www.twilio.com/try-twilio).
|
25
|
+
To use the Authy API you will need a Twilio Account, [sign up for a free Twilio account here](https://www.twilio.com/try-twilio).
|
8
26
|
|
9
27
|
Create an [Authy Application in the Twilio console](https://www.twilio.com/console/authy/applications) and take note of the API key.
|
10
28
|
|
@@ -38,17 +56,55 @@ Add `Devise Authy` to your App:
|
|
38
56
|
|
39
57
|
### Configuring Models
|
40
58
|
|
41
|
-
|
59
|
+
You can add devise_authy to your user model in two ways.
|
42
60
|
|
43
|
-
|
61
|
+
#### With the generator
|
44
62
|
|
45
|
-
|
63
|
+
This is the easiest way and is recommended. Run the following command:
|
64
|
+
|
65
|
+
```bash
|
66
|
+
rails g devise_authy [MODEL_NAME]
|
67
|
+
```
|
68
|
+
|
69
|
+
#### Manually
|
70
|
+
|
71
|
+
Add `:authy_authenticatable` to the `devise` options in your Devise user model:
|
46
72
|
|
47
73
|
```ruby
|
48
74
|
devise :authy_authenticatable, :database_authenticatable
|
49
75
|
```
|
50
76
|
|
51
|
-
|
77
|
+
Also add a new migration. For example, if you are adding to the `User` model, use this migration:
|
78
|
+
|
79
|
+
```ruby
|
80
|
+
class DeviseAuthyAddToUsers < ActiveRecord::Migration[6.0]
|
81
|
+
def self.up
|
82
|
+
change_table :users do |t|
|
83
|
+
t.string :authy_id
|
84
|
+
t.datetime :last_sign_in_with_authy
|
85
|
+
t.boolean :authy_enabled, :default => false
|
86
|
+
end
|
87
|
+
|
88
|
+
add_index :users, :authy_id
|
89
|
+
end
|
90
|
+
|
91
|
+
def self.down
|
92
|
+
change_table :users do |t|
|
93
|
+
t.remove :authy_id, :last_sign_in_with_authy, :authy_enabled
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
```
|
98
|
+
|
99
|
+
#### Final steps
|
100
|
+
|
101
|
+
For either method above, run the migrations:
|
102
|
+
|
103
|
+
```bash
|
104
|
+
rake db:migrate
|
105
|
+
```
|
106
|
+
|
107
|
+
**[Optional]** Update the default routes to point to something like:
|
52
108
|
|
53
109
|
```ruby
|
54
110
|
devise_for :users, :path_names => {
|
@@ -59,10 +115,6 @@ devise_for :users, :path_names => {
|
|
59
115
|
}
|
60
116
|
```
|
61
117
|
|
62
|
-
Then run the migrations:
|
63
|
-
|
64
|
-
rake db:migrate
|
65
|
-
|
66
118
|
Now whenever a user wants to enable two-factor authentication they can go to:
|
67
119
|
|
68
120
|
http://your-app/users/enable-two-factor
|
@@ -71,7 +123,6 @@ And when the user logs in they will be redirected to:
|
|
71
123
|
|
72
124
|
http://your-app/users/verify-token
|
73
125
|
|
74
|
-
|
75
126
|
## Custom Views
|
76
127
|
|
77
128
|
If you want to customise your views, you can modify the files that are located at:
|
@@ -118,7 +169,6 @@ And tell the router to use this controller
|
|
118
169
|
devise_for :users, controllers: {devise_authy: 'my_custom_module/devise_authy'}
|
119
170
|
```
|
120
171
|
|
121
|
-
|
122
172
|
## I18n
|
123
173
|
|
124
174
|
The install generator also copies a `Devise Authy` i18n file which you can find at:
|
@@ -145,10 +195,36 @@ To enable [Authy push authentication](https://www.twilio.com/authy/features/push
|
|
145
195
|
config.authy_enable_onetouch = true
|
146
196
|
```
|
147
197
|
|
198
|
+
## Generic authenticator token support
|
199
|
+
|
200
|
+
Authy supports other authenticator apps by providing a QR code that your users can scan.
|
201
|
+
|
202
|
+
> **To use this feature, you need to enable it in your [Twilio Console](https://www.twilio.com/console/authy/applications)**
|
203
|
+
|
204
|
+
Once you have enabled generic authenticator tokens, you can enable this in devise-authy by modifying the Devise config file `config/initializers/devise.rb` and adding the configuration:
|
205
|
+
|
206
|
+
```
|
207
|
+
config.authy_enable_qr_code = true
|
208
|
+
```
|
209
|
+
|
210
|
+
This will display a QR code on the verification screen (you still need to take a user's phone number and country code). If you have implemented your own views, the QR code URL is available on the verification page as `@authy_qr_code`.
|
211
|
+
|
212
|
+
## Rails 5 CSRF protection
|
213
|
+
|
214
|
+
In Rails 5 `protect_from_forgery` is no longer prepended to the `before_action` chain. If you call `authenticate_user` before `protect_from_forgery` your request will result in a "Can't verify CSRF token authenticity" error.
|
215
|
+
|
216
|
+
To remedy this, add `prepend: true` to your `protect_from_forgery` call, like in this example from the [Authy Devise demo app](https://github.com/twilio/authy-devise-demo):
|
217
|
+
|
218
|
+
```ruby
|
219
|
+
class ApplicationController < ActionController::Base
|
220
|
+
protect_from_forgery with: :exception, prepend: true
|
221
|
+
end
|
222
|
+
```
|
148
223
|
|
149
224
|
## Running Tests
|
150
225
|
|
151
226
|
To prepare the tests run the following commands:
|
227
|
+
|
152
228
|
```bash
|
153
229
|
$ cd spec/rails-app
|
154
230
|
$ bundle install
|
@@ -156,17 +232,11 @@ $ RAILS_ENV=test bundle exec rake db:migrate
|
|
156
232
|
```
|
157
233
|
|
158
234
|
Now on the project root run the following commands:
|
235
|
+
|
159
236
|
```bash
|
160
237
|
$ bundle exec rspec spec/
|
161
238
|
```
|
162
239
|
|
163
|
-
## Backporting to Rails 3
|
164
|
-
|
165
|
-
While we are not currently supporting Rails 3, there's an active fork that maintains the backwards compatibility.
|
166
|
-
|
167
|
-
https://github.com/gcosta/authy-devise
|
168
|
-
|
169
240
|
## Copyright
|
170
241
|
|
171
|
-
Copyright (c) 2012-2020 Authy Inc. See LICENSE.txt for
|
172
|
-
further details.
|
242
|
+
Copyright (c) 2012-2020 Authy Inc. See LICENSE.txt for further details.
|
@@ -5,17 +5,25 @@ class Devise::DeviseAuthyController < DeviseController
|
|
5
5
|
prepend_before_action :find_resource_and_require_password_checked, :only => [
|
6
6
|
:GET_verify_authy, :POST_verify_authy, :GET_authy_onetouch_status
|
7
7
|
]
|
8
|
+
|
9
|
+
prepend_before_action :check_resource_has_authy_id, :only => [
|
10
|
+
:GET_verify_authy_installation, :POST_verify_authy_installation
|
11
|
+
]
|
12
|
+
|
13
|
+
prepend_before_action :check_resource_not_authy_enabled, :only => [
|
14
|
+
:GET_verify_authy_installation, :POST_verify_authy_installation
|
15
|
+
]
|
16
|
+
|
8
17
|
prepend_before_action :authenticate_scope!, :only => [
|
9
|
-
:GET_enable_authy, :POST_enable_authy,
|
10
|
-
:
|
11
|
-
:POST_disable_authy
|
18
|
+
:GET_enable_authy, :POST_enable_authy, :GET_verify_authy_installation,
|
19
|
+
:POST_verify_authy_installation, :POST_disable_authy
|
12
20
|
]
|
21
|
+
|
13
22
|
include Devise::Controllers::Helpers
|
14
23
|
|
15
24
|
def GET_verify_authy
|
16
|
-
@authy_id = @resource.authy_id
|
17
25
|
if resource_class.authy_enable_onetouch
|
18
|
-
approval_request = send_one_touch_request['approval_request']
|
26
|
+
approval_request = send_one_touch_request(@resource.authy_id)['approval_request']
|
19
27
|
@onetouch_uuid = approval_request['uuid'] if approval_request.present?
|
20
28
|
end
|
21
29
|
render :verify_authy
|
@@ -30,10 +38,8 @@ class Devise::DeviseAuthyController < DeviseController
|
|
30
38
|
})
|
31
39
|
|
32
40
|
if token.ok?
|
33
|
-
remember_device if params[:remember_device].to_i == 1
|
34
|
-
|
35
|
-
@resource.remember_me = true
|
36
|
-
end
|
41
|
+
remember_device(@resource.id) if params[:remember_device].to_i == 1
|
42
|
+
remember_user
|
37
43
|
record_authy_authentication
|
38
44
|
respond_with resource, :location => after_sign_in_path_for(@resource)
|
39
45
|
else
|
@@ -61,13 +67,11 @@ class Devise::DeviseAuthyController < DeviseController
|
|
61
67
|
if @authy_user.ok?
|
62
68
|
resource.authy_id = @authy_user.id
|
63
69
|
if resource.save
|
64
|
-
|
70
|
+
redirect_to [resource_name, :verify_authy_installation] and return
|
65
71
|
else
|
66
72
|
set_flash_message(:error, :not_enabled)
|
67
73
|
redirect_to after_authy_enabled_path_for(resource) and return
|
68
74
|
end
|
69
|
-
|
70
|
-
redirect_to [resource_name, :verify_authy_installation]
|
71
75
|
else
|
72
76
|
set_flash_message(:error, :not_enabled)
|
73
77
|
render :enable_authy
|
@@ -76,22 +80,39 @@ class Devise::DeviseAuthyController < DeviseController
|
|
76
80
|
|
77
81
|
# Disable 2FA
|
78
82
|
def POST_disable_authy
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
83
|
+
authy_id = resource.authy_id
|
84
|
+
resource.assign_attributes(:authy_enabled => false, :authy_id => nil)
|
85
|
+
resource.save(:validate => false)
|
86
|
+
|
87
|
+
other_resource = resource.class.find_by(:authy_id => authy_id)
|
88
|
+
if other_resource
|
89
|
+
# If another resource has the same authy_id, do not delete the user from
|
90
|
+
# the API.
|
84
91
|
forget_device
|
85
|
-
|
86
92
|
set_flash_message(:notice, :disabled)
|
87
93
|
else
|
88
|
-
|
94
|
+
response = Authy::API.delete_user(:id => authy_id)
|
95
|
+
if response.ok?
|
96
|
+
forget_device
|
97
|
+
set_flash_message(:notice, :disabled)
|
98
|
+
else
|
99
|
+
# If deleting the user from the API fails, set everything back to what
|
100
|
+
# it was before.
|
101
|
+
# I'm not sure this is a good idea, but it was existing behaviour.
|
102
|
+
# Could be changed in a major version bump.
|
103
|
+
resource.assign_attributes(:authy_enabled => true, :authy_id => authy_id)
|
104
|
+
resource.save(:validate => false)
|
105
|
+
set_flash_message(:error, :not_disabled)
|
106
|
+
end
|
89
107
|
end
|
90
|
-
|
91
108
|
redirect_to after_authy_disabled_path_for(resource)
|
92
109
|
end
|
93
110
|
|
94
111
|
def GET_verify_authy_installation
|
112
|
+
if resource_class.authy_enable_qr_code
|
113
|
+
response = Authy::API.request_qr_code(id: resource.authy_id)
|
114
|
+
@authy_qr_code = response.qr_code
|
115
|
+
end
|
95
116
|
render :verify_authy_installation
|
96
117
|
end
|
97
118
|
|
@@ -105,6 +126,7 @@ class Devise::DeviseAuthyController < DeviseController
|
|
105
126
|
self.resource.authy_enabled = token.ok?
|
106
127
|
|
107
128
|
if token.ok? && self.resource.save
|
129
|
+
remember_device(@resource.id) if params[:remember_device].to_i == 1
|
108
130
|
record_authy_authentication
|
109
131
|
set_flash_message(:notice, :enabled)
|
110
132
|
redirect_to after_authy_verified_path_for(resource)
|
@@ -114,17 +136,20 @@ class Devise::DeviseAuthyController < DeviseController
|
|
114
136
|
end
|
115
137
|
|
116
138
|
def GET_authy_onetouch_status
|
117
|
-
|
139
|
+
response = Authy::OneTouch.approval_request_status(:uuid => params[:onetouch_uuid])
|
140
|
+
status = response.dig('approval_request', 'status')
|
118
141
|
case status
|
119
142
|
when 'pending'
|
120
143
|
head 202
|
121
144
|
when 'approved'
|
145
|
+
remember_device(@resource.id) if params[:remember_device].to_i == 1
|
146
|
+
remember_user
|
122
147
|
record_authy_authentication
|
123
148
|
render json: { redirect: after_sign_in_path_for(@resource) }
|
124
149
|
when 'denied'
|
125
150
|
head :unauthorized
|
126
151
|
else
|
127
|
-
head :
|
152
|
+
head :internal_server_error
|
128
153
|
end
|
129
154
|
end
|
130
155
|
|
@@ -172,6 +197,16 @@ class Devise::DeviseAuthyController < DeviseController
|
|
172
197
|
end
|
173
198
|
end
|
174
199
|
|
200
|
+
def check_resource_has_authy_id
|
201
|
+
redirect_to [resource_name, :enable_authy] if !resource.authy_id
|
202
|
+
end
|
203
|
+
|
204
|
+
def check_resource_not_authy_enabled
|
205
|
+
if resource.authy_id && resource.authy_enabled
|
206
|
+
redirect_to after_authy_verified_path_for(resource)
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
175
210
|
protected
|
176
211
|
|
177
212
|
def after_authy_enabled_path_for(resource)
|
@@ -202,4 +237,10 @@ class Devise::DeviseAuthyController < DeviseController
|
|
202
237
|
def after_account_is_locked
|
203
238
|
sign_out_and_redirect @resource
|
204
239
|
end
|
240
|
+
|
241
|
+
def remember_user
|
242
|
+
if session.delete("#{resource_name}_remember_me") == true && @resource.respond_to?(:remember_me=)
|
243
|
+
@resource.remember_me = true
|
244
|
+
end
|
245
|
+
end
|
205
246
|
end
|