devise-passwordless 0.4.0 → 0.5.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0c07993e3995252a9cdc3e65f5fd8a21564bde80e33244310ff4d0b3d553d49c
4
- data.tar.gz: 329ce513cb9d7b8e85f39d8d85ce32d2192c653237750722e7a010a750541a33
3
+ metadata.gz: 1d2e1ca1ad92971a19df58fd41e8e017c147f241705588a80eeb622142b256ce
4
+ data.tar.gz: 77ed842f7ae12a33fbf181fecac1770c0f9f4f4d9a0c842ed634d41da8946a96
5
5
  SHA512:
6
- metadata.gz: fd1df26917844eab3030415ae4ecb2507925ddd957885767c2278653d86c43a0d5727223dc8fc67623348088e9957ab981302cec32b72d2785b60d6e9606d96a
7
- data.tar.gz: 5009df7b815ee82e211e6e47508038f8b3c9d94d4fff693c40c54b6cd84c244226038fe4630541ef8ce1528c1d6fd9f5fd19ad79e64fd236a25e5c75f01b3ec3
6
+ metadata.gz: 5a496c66a599f699c4b7c451394c7d4bb4f9c4f8af1ff1195ea8dfb1c348a2af658a4f780238a36e42ff208d280d908a0df708c6cb9e23c64a01d81b5e4e73e5
7
+ data.tar.gz: 3e27189adc9b61ff6a455bf0defbbdbaa01a436ef4caed221f2f84d6261aff6a40532e8393e61c8a34fe5516dd4b75bf728339f1ecd33808807ef9bc3561d017
data/README.md CHANGED
@@ -4,9 +4,9 @@ A passwordless a.k.a. "magic link" login strategy for [Devise][]
4
4
 
5
5
  ## Features
6
6
 
7
- * No database migrations / state needed - links are stateless encrypted tokens thanks to Rails's MessageEncryptor
7
+ * No special database migrations needed - magic links are stateless encrypted tokens
8
8
  * Magic links are sent from your app - not a mounted Rails engine - so path and URL helpers work as expected
9
- * Multiple user types
9
+ * [Supports multiple user (resource) types](#multiple-user-resource-types)
10
10
  * All the goodness of Devise!
11
11
 
12
12
  ## Installation
@@ -37,7 +37,7 @@ 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, for a User model, you can now do this (other strategies listed are optional and not exhaustive):
40
+ For example, given a User model, you can now do this (other strategies listed are optional and not exhaustive):
41
41
 
42
42
  ```ruby
43
43
  # app/models/user.rb
@@ -50,20 +50,17 @@ class User < ApplicationRecord
50
50
  end
51
51
  ```
52
52
 
53
- Then, you'll need to generate two controllers to modify Devise's default session create logic and to handle processing magic links:
54
-
55
- ```
56
- $ rails g devise:passwordless:controller User
57
- ```
58
-
59
- Then, set up your Devise routes like so to use these controllers:
53
+ Then, you'll need to set up your Devise routes like so to use the passwordless controllers to modify Devise's default session create logic and to handle processing magic links:
60
54
 
61
55
  ```ruby
62
56
  # config/routes.rb
63
57
  Rails.application.routes.draw do
64
- devise_for :users, controllers: { sessions: "users/sessions" }
58
+ devise_for :users,
59
+ controllers: { sessions: "devise/passwordless/sessions" }
65
60
  devise_scope :user do
66
- get "/users/magic_links" => "users/magic_links#show"
61
+ get "/users/magic_link",
62
+ to: "devise/passwordless/magic_links#show",
63
+ as: "users_magic_link"
67
64
  end
68
65
  end
69
66
  ```
@@ -130,6 +127,71 @@ en:
130
127
 
131
128
  To customize the magic link email body, edit `app/views/devise/mailer/magic_link.html.erb`
132
129
 
130
+ ### Multiple user (resource) types
131
+
132
+ Devise supports multiple resource types, so we do too.
133
+
134
+ For example, if you have a User and Admin model, enable the `:magic_link_authenticatable` strategy for each:
135
+
136
+ ```ruby
137
+ # app/models/user.rb
138
+ class User < ApplicationRecord
139
+ devise :magic_link_authenticatable # , :registerable, :rememberable, ...
140
+ end
141
+
142
+ # app/models/admin.rb
143
+ class Admin < ApplicationRecord
144
+ devise :magic_link_authenticatable # , :registerable, :rememberable, ...
145
+ end
146
+ ```
147
+
148
+ Then just set up your routes like this:
149
+
150
+ ```ruby
151
+ # config/routes.rb
152
+ Rails.application.routes.draw do
153
+ devise_for :users,
154
+ controllers: { sessions: "devise/passwordless/sessions" }
155
+ devise_scope :user do
156
+ get "/users/magic_link",
157
+ to: "devise/passwordless/magic_links#show",
158
+ as: "users_magic_link"
159
+ end
160
+ devise_for :admins,
161
+ controllers: { sessions: "devise/passwordless/sessions" }
162
+ devise_scope :admin do
163
+ get "/admins/magic_link",
164
+ to: "devise/passwordless/magic_links#show",
165
+ as: "admins_magic_link"
166
+ end
167
+ end
168
+ ```
169
+
170
+ And that's it!
171
+
172
+ Messaging can be customized per-resource using [Devise's usual I18n support][devise-i18n]:
173
+
174
+ ```yaml
175
+ en:
176
+ devise:
177
+ passwordless:
178
+ user:
179
+ not_found_in_database: "Could not find a USER for that email address"
180
+ magic_link_sent: "A USER login link has been sent to your email address. Please follow the link to log in to your account."
181
+ admin:
182
+ not_found_in_database: "Could not find an ADMIN for that email address"
183
+ magic_link_sent: "An ADMIN login link has been sent to your email address. Please follow the link to log in to your account."
184
+ failure:
185
+ user:
186
+ magic_link_invalid: "Invalid or expired USER login link."
187
+ admin:
188
+ magic_link_invalid: "Invalid or expired ADMIN login link."
189
+ mailer:
190
+ magic_link:
191
+ user_subject: "Here's your USER magic login link ✨"
192
+ admin_subject: "Here's your ADMIN magic login link ✨"
193
+ ```
194
+
133
195
  ### Notes on other Devise strategies
134
196
 
135
197
  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:
@@ -147,3 +209,4 @@ If using the `:confirmable` strategy, you may want to override the default Devis
147
209
  The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
148
210
 
149
211
  [Devise]: https://github.com/heartcombo/devise
212
+ [devise-i18n]: https://github.com/heartcombo/devise#i18n
@@ -1,5 +1,5 @@
1
1
  module Devise
2
2
  module Passwordless
3
- VERSION = "0.4.0"
3
+ VERSION = "0.5.0"
4
4
  end
5
5
  end
@@ -5,7 +5,19 @@ require "yaml"
5
5
  module Devise::Passwordless
6
6
  module Generators # :nodoc:
7
7
  class InstallGenerator < ::Rails::Generators::Base # :nodoc:
8
- desc "Creates default install and config files for the Devise passwordless auth strategy"
8
+ desc "Creates default install and config files for the Devise :magic_link_authenticatable strategy"
9
+
10
+ def self.default_generator_root
11
+ File.dirname(__FILE__)
12
+ end
13
+
14
+ def create_sessions_controller
15
+ template "sessions_controller.rb.erb", "app/controllers/devise/passwordless/sessions_controller.rb"
16
+ end
17
+
18
+ def create_magic_links_controller
19
+ template "magic_links_controller.rb.erb", "app/controllers/devise/passwordless/magic_links_controller.rb"
20
+ end
9
21
 
10
22
  def update_devise_initializer
11
23
  inject_into_file 'config/initializers/devise.rb', before: /^end$/ do <<~'CONFIG'.indent(2)
@@ -39,7 +51,7 @@ module Devise::Passwordless
39
51
 
40
52
  <p>You can login using the link below:</p>
41
53
 
42
- <p><%= link_to "Log in to my account", send("#{@scope_name.to_s.pluralize}_magic_links_url", Hash[@scope_name, {email: @resource.email, token: @token, remember_me: @remember_me}]) %></p>
54
+ <p><%= link_to "Log in to my account", send("#{@scope_name.to_s.pluralize}_magic_link_url", Hash[@scope_name, {email: @resource.email, token: @token, remember_me: @remember_me}]) %></p>
43
55
 
44
56
  <p>Note that the link will expire in <%= Devise.passwordless_login_within.inspect %>.</p>
45
57
  FILE
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  <% module_namespacing do -%>
4
- class <%= class_name.pluralize %>::MagicLinksController < DeviseController
4
+ class Devise::Passwordless::MagicLinksController < DeviseController
5
5
  prepend_before_action :require_no_authentication, only: :show
6
6
  prepend_before_action :allow_params_authentication!, only: :show
7
7
  prepend_before_action(only: [:show]) { request.env["devise.skip_timeout"] = true }
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  <% module_namespacing do -%>
4
- class <%= class_name.pluralize %>::SessionsController < Devise::SessionsController
4
+ class Devise::Passwordless::SessionsController < Devise::SessionsController
5
5
  def create
6
6
  self.resource = resource_class.find_by(email: create_params[:email])
7
7
  if self.resource
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.0
4
+ version: 0.5.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: 2020-11-12 00:00:00.000000000 Z
11
+ date: 2020-11-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: devise
@@ -89,7 +89,6 @@ files:
89
89
  - lib/devise/passwordless/mailer.rb
90
90
  - lib/devise/passwordless/version.rb
91
91
  - lib/devise/strategies/magic_link_authenticatable.rb
92
- - lib/generators/devise/passwordless/controller_generator.rb
93
92
  - lib/generators/devise/passwordless/install_generator.rb
94
93
  - lib/generators/devise/passwordless/templates/magic_links_controller.rb.erb
95
94
  - lib/generators/devise/passwordless/templates/sessions_controller.rb.erb
@@ -1,21 +0,0 @@
1
- require "rails/generators/named_base"
2
-
3
- module Devise::Passwordless
4
- module Generators # :nodoc:
5
- class ControllerGenerator < ::Rails::Generators::NamedBase # :nodoc:
6
- desc "Creates the session and magic link controllers needed for a Devise resource to use passwordless auth"
7
-
8
- def self.default_generator_root
9
- File.dirname(__FILE__)
10
- end
11
-
12
- def create_sessions_controller
13
- template "sessions_controller.rb.erb", File.join("app/controllers", class_path, plural_name, "sessions_controller.rb")
14
- end
15
-
16
- def create_magic_links_controller
17
- template "magic_links_controller.rb.erb", File.join("app/controllers", class_path, plural_name, "magic_links_controller.rb")
18
- end
19
- end
20
- end
21
- end