devise-passwordless 0.5.0 → 0.7.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/.github/workflows/test.yml +45 -0
- data/.gitignore +4 -0
- data/.rspec +1 -0
- data/Gemfile +7 -0
- data/README.md +36 -6
- data/devise-passwordless.gemspec +0 -4
- data/lib/devise/passwordless/mailer.rb +1 -0
- data/lib/devise/passwordless/version.rb +1 -1
- data/lib/devise/strategies/magic_link_authenticatable.rb +5 -1
- data/lib/generators/devise/passwordless/install_generator.rb +15 -5
- data/lib/generators/devise/passwordless/templates/magic_links_controller.rb.erb +2 -1
- metadata +4 -45
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e4d3b59e8b6d694c28b8e7c92b3b2ce7d98a7e5e9e56465507f23f1b1877dd6a
|
4
|
+
data.tar.gz: f92dee4b5e717eefad98c69ff5920abc6ecda078911fb0abf0ca922c394d1109
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6af729d1e068eca1b204a32b9944e893c13b5af2c2cced3ae619c94cc19203ca58f5ee30a2911f8e45541ab5e1c7f685dfea0f3a8867065ba76af3b92b58b99b
|
7
|
+
data.tar.gz: b7a87a3d7e8bc28a8ca3d4737ca7093a1d8ac7faac14d1cdb04c163fc9b9d3b6fd8d9f2dc2be3fbf5f80830445c8f7a310a9b3c2bcc5ddfc431b9f836f7cd0bf
|
@@ -0,0 +1,45 @@
|
|
1
|
+
name: test
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches: [ master ]
|
6
|
+
pull_request:
|
7
|
+
branches: [ master ]
|
8
|
+
|
9
|
+
jobs:
|
10
|
+
test:
|
11
|
+
runs-on: ubuntu-latest
|
12
|
+
strategy:
|
13
|
+
matrix:
|
14
|
+
ruby-version:
|
15
|
+
- 3.0
|
16
|
+
- 2.7
|
17
|
+
- 2.6
|
18
|
+
- 2.5
|
19
|
+
gemfile:
|
20
|
+
- Gemfile-rails-7
|
21
|
+
- Gemfile-rails-6.1
|
22
|
+
- Gemfile-rails-6.0
|
23
|
+
exclude:
|
24
|
+
# Rails 7 requires Ruby 2.7+
|
25
|
+
- ruby-version: 2.5
|
26
|
+
gemfile: Gemfile-rails-7
|
27
|
+
- ruby-version: 2.6
|
28
|
+
gemfile: Gemfile-rails-7
|
29
|
+
steps:
|
30
|
+
- uses: actions/checkout@v2
|
31
|
+
- name: Set up Ruby ${{ matrix.ruby-version }}
|
32
|
+
uses: ruby/setup-ruby@477b21f02be01bcb8030d50f37cfec92bfa615b6
|
33
|
+
with:
|
34
|
+
ruby-version: ${{ matrix.ruby-version }}
|
35
|
+
- name: Run gem tests
|
36
|
+
run: |
|
37
|
+
bundle
|
38
|
+
bundle exec rake
|
39
|
+
- name: Run Rails dummy app tests
|
40
|
+
working-directory: ./spec/dummy_app
|
41
|
+
env:
|
42
|
+
BUNDLE_GEMFILE: gemfiles/${{ matrix.gemfile }}
|
43
|
+
run: |
|
44
|
+
bundle
|
45
|
+
bundle exec rake
|
data/.gitignore
CHANGED
data/.rspec
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -37,16 +37,12 @@ See the [customization section](#customization) for details on what gets install
|
|
37
37
|
|
38
38
|
This gem adds a `:magic_link_authenticatable` strategy that can be used in your Devise models for passwordless authentication. This strategy plays well with most other Devise strategies (see [*notes on other Devise strategies*](#notes-on-other-devise-strategies)).
|
39
39
|
|
40
|
-
For example,
|
40
|
+
For example, if your Devise model is User, enable the strategy like this:
|
41
41
|
|
42
42
|
```ruby
|
43
43
|
# app/models/user.rb
|
44
44
|
class User < ApplicationRecord
|
45
|
-
devise :magic_link_authenticatable,
|
46
|
-
:registerable,
|
47
|
-
:rememberable,
|
48
|
-
:validatable,
|
49
|
-
:confirmable
|
45
|
+
devise :magic_link_authenticatable #, :registerable, :rememberable, ...
|
50
46
|
end
|
51
47
|
```
|
52
48
|
|
@@ -84,6 +80,15 @@ And these should be edited to remove password references:
|
|
84
80
|
* `app/views/devise/sessions/new.html.erb`
|
85
81
|
* Delete field `:password`
|
86
82
|
|
83
|
+
#### Manually sending magic links
|
84
|
+
|
85
|
+
You can very easily send a magic link at any point like so:
|
86
|
+
|
87
|
+
```ruby
|
88
|
+
remember_me = true
|
89
|
+
User.send_magic_link(remember_me)
|
90
|
+
```
|
91
|
+
|
87
92
|
## Customization
|
88
93
|
|
89
94
|
Configuration options are stored in Devise's initializer at `config/initializers/devise.rb`:
|
@@ -192,6 +197,24 @@ en:
|
|
192
197
|
admin_subject: "Here's your ADMIN magic login link ✨"
|
193
198
|
```
|
194
199
|
|
200
|
+
#### Scoped views
|
201
|
+
|
202
|
+
If you have multiple Devise models, some that are passwordless and some that aren't, you will probably want to enable [Devise's `scoped_views` setting](https://henrytabima.github.io/rails-setup/docs/devise/configuring-views) so that the models have different signup and login pages (since some models will need password fields and others won't).
|
203
|
+
|
204
|
+
If you need to generate fresh Devise views for your models, you can do so like so:
|
205
|
+
|
206
|
+
```
|
207
|
+
$ rails generate devise:views users
|
208
|
+
$ rails generate devise:views admins
|
209
|
+
```
|
210
|
+
|
211
|
+
Which will generate the whole set of Devise views under these paths:
|
212
|
+
|
213
|
+
```
|
214
|
+
app/views/users/
|
215
|
+
app/views/admins/
|
216
|
+
```
|
217
|
+
|
195
218
|
### Notes on other Devise strategies
|
196
219
|
|
197
220
|
If using the `:rememberable` strategy for "remember me" functionality, you'll need to add a `remember_token` column to your resource, as by default that strategy assumes you're using a password auth strategy and relies on comparing the password's salt to validate cookies:
|
@@ -204,6 +227,13 @@ end
|
|
204
227
|
|
205
228
|
If using the `:confirmable` strategy, you may want to override the default Devise behavior of requiring a fresh login after email confirmation (e.g. [this](https://stackoverflow.com/a/39010334/215168) or [this](https://stackoverflow.com/a/25865526/215168) approach). Otherwise, users will have to get a fresh login link after confirming their email, which makes little sense if they just confirmed they own the email address.
|
206
229
|
|
230
|
+
## Alternatives
|
231
|
+
|
232
|
+
Other Ruby libraries that offer passwordless authentication:
|
233
|
+
|
234
|
+
* [passwordless](https://github.com/mikker/passwordless)
|
235
|
+
* [magic-link](https://github.com/dvanderbeek/magic-link)
|
236
|
+
|
207
237
|
## License
|
208
238
|
|
209
239
|
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/devise-passwordless.gemspec
CHANGED
@@ -38,8 +38,4 @@ Gem::Specification.new do |spec|
|
|
38
38
|
spec.required_ruby_version = ">= 2.1.0"
|
39
39
|
|
40
40
|
spec.add_dependency "devise"
|
41
|
-
|
42
|
-
spec.add_development_dependency "bundler", "~> 1.17"
|
43
|
-
spec.add_development_dependency "rake", "~> 10.0"
|
44
|
-
spec.add_development_dependency "rspec", "~> 3.0"
|
45
41
|
end
|
@@ -21,7 +21,7 @@ module Devise
|
|
21
21
|
|
22
22
|
def authenticate!
|
23
23
|
begin
|
24
|
-
data =
|
24
|
+
data = decode_passwordless_token
|
25
25
|
rescue Devise::Passwordless::LoginToken::InvalidOrExpiredTokenError
|
26
26
|
fail!(:magic_link_invalid)
|
27
27
|
return
|
@@ -50,6 +50,10 @@ module Devise
|
|
50
50
|
|
51
51
|
private
|
52
52
|
|
53
|
+
def decode_passwordless_token
|
54
|
+
Devise::Passwordless::LoginToken.decode(self.token)
|
55
|
+
end
|
56
|
+
|
53
57
|
# Sets the authentication hash and the token from params_auth_hash or http_auth_hash.
|
54
58
|
def with_authentication_hash(auth_type, auth_values)
|
55
59
|
self.authentication_hash, self.authentication_type = {}, auth_type
|
@@ -60,10 +60,13 @@ module Devise::Passwordless
|
|
60
60
|
|
61
61
|
def update_devise_yaml
|
62
62
|
devise_yaml = "config/locales/devise.en.yml"
|
63
|
+
existing_config = {}
|
63
64
|
begin
|
64
|
-
|
65
|
+
in_root do
|
66
|
+
existing_config = YAML.load_file(devise_yaml)
|
67
|
+
end
|
65
68
|
rescue Errno::ENOENT
|
66
|
-
|
69
|
+
say_status :skip, devise_yaml, :yellow
|
67
70
|
return
|
68
71
|
end
|
69
72
|
default_config = {
|
@@ -84,9 +87,16 @@ module Devise::Passwordless
|
|
84
87
|
}
|
85
88
|
}
|
86
89
|
}
|
87
|
-
merged_config =
|
88
|
-
|
89
|
-
|
90
|
+
merged_config = existing_config.deep_merge(default_config.deep_stringify_keys)
|
91
|
+
if existing_config.to_yaml == merged_config.to_yaml
|
92
|
+
say_status :identical, devise_yaml, :blue
|
93
|
+
else
|
94
|
+
in_root do
|
95
|
+
File.open(devise_yaml, "w") do |f|
|
96
|
+
f.write(force_double_quote_yaml(merged_config.to_yaml))
|
97
|
+
end
|
98
|
+
end
|
99
|
+
say_status :insert, devise_yaml, :green
|
90
100
|
end
|
91
101
|
end
|
92
102
|
|
@@ -17,7 +17,8 @@ class Devise::Passwordless::MagicLinksController < DeviseController
|
|
17
17
|
protected
|
18
18
|
|
19
19
|
def auth_options
|
20
|
-
|
20
|
+
mapping = Devise.mappings[resource_name]
|
21
|
+
{ scope: resource_name, recall: "#{mapping.controllers[:sessions]}#new" }
|
21
22
|
end
|
22
23
|
|
23
24
|
def translation_scope
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: devise-passwordless
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Abe Voelker
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-03-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: devise
|
@@ -24,48 +24,6 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: bundler
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '1.17'
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '1.17'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: rake
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - "~>"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '10.0'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '10.0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: rspec
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - "~>"
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '3.0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - "~>"
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '3.0'
|
69
27
|
description:
|
70
28
|
email:
|
71
29
|
- _@abevoelker.com
|
@@ -73,6 +31,7 @@ executables: []
|
|
73
31
|
extensions: []
|
74
32
|
extra_rdoc_files: []
|
75
33
|
files:
|
34
|
+
- ".github/workflows/test.yml"
|
76
35
|
- ".gitignore"
|
77
36
|
- ".rspec"
|
78
37
|
- ".travis.yml"
|
@@ -113,7 +72,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
113
72
|
- !ruby/object:Gem::Version
|
114
73
|
version: '0'
|
115
74
|
requirements: []
|
116
|
-
rubygems_version: 3.
|
75
|
+
rubygems_version: 3.1.6
|
117
76
|
signing_key:
|
118
77
|
specification_version: 4
|
119
78
|
summary: Passwordless (email-only) login strategy for Devise
|