magic-link 0.3.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 700ad70db490a9105bc1e0a8df8f95524ee2a6407abcde3b1344acb077454ceb
4
- data.tar.gz: d184b396e2f106174502ebd8881ddab8393071d4dab29d2e348c537c7f7bec52
3
+ metadata.gz: 549ae2f89461444bd190d9eb79237df57a13414c45a228b0ea0519fd34f779d3
4
+ data.tar.gz: 3a2886647663207bc1244fb83b62e18684175548df6387a28c80b630b64b2e0a
5
5
  SHA512:
6
- metadata.gz: bf724fbf943fa48ac5674ab6cab73e9b6478305036faa90eff3bb8eb46659c76f6404e029e3674a51d0bb8e4142d197f83afac0ed335a03b22817fd2cc4997b4
7
- data.tar.gz: c938533daf23c5b908e1671ac29faca01643e221d4e41cdafb76ee0e8ed859e920021de6ee6dd3d7f1438e0555f7da1df74b689e41d3d8ac358275eae50441e5
6
+ metadata.gz: 97c19cc64c7b472f2daca7c194cf20d3567e1b748a585bf4c399a95be8f4aac03a86bc89266fb7188baf63863abbbef7f5570a188b2d8c56c8b38f6db1638d2d
7
+ data.tar.gz: 37c5512f629233c4a577f3226caec72ee595c2d1516f30b9af9a5ca9adfabcc1d94c1a5b27a31b5dde7ed7b85f922efb0e1c6f9c58d466d061581c31cf1f22e3
data/README.md CHANGED
@@ -19,7 +19,7 @@ mount the engine
19
19
  mount Magic::Link::Engine, at: '/'
20
20
  ```
21
21
 
22
- Now users can visit `/magic_links/new` to enter their email and have a sign in
22
+ Now users can visit `/magic_links/new` (which you can link to with `magic_link.new_magic_link_path`) to enter their email and have a sign in
23
23
  link sent to them via email. Tokens are cleared after use and expire after the
24
24
  configured number of hours
25
25
 
@@ -13,6 +13,26 @@ module Magic
13
13
  redirect_to main_app.root_path, notice: "Check your email for a sign in link!"
14
14
  end
15
15
 
16
+ def authenticate
17
+ email = params[:email].presence
18
+ token = params[:sign_in_token].presence
19
+ user = email && token && Magic::Link.user_class.find_by(email: email)
20
+
21
+ # TODO: Handle a different user trying to sign in
22
+ if token && send("#{Magic::Link.user_class.name.underscore}_signed_in?")
23
+ flash[:alert] = "You are already signed in"
24
+ redirect_to main_app.send(Magic::Link.after_sign_in_path)
25
+ elsif user && token_matches?(user) && token_not_expired?(user)
26
+ flash[:notice] = "You have signed in successfully"
27
+ user.update_columns(sign_in_token: nil, sign_in_token_sent_at: nil)
28
+ sign_in user
29
+ redirect_to main_app.send(Magic::Link.after_sign_in_path)
30
+ elsif email && token
31
+ flash[:alert] = "Your sign in token is invalid"
32
+ redirect_to magic_link.new_magic_link_path
33
+ end
34
+ end
35
+
16
36
  private
17
37
 
18
38
  def check_user
@@ -21,6 +41,17 @@ module Magic
21
41
  end
22
42
  end
23
43
 
44
+ def token_matches?(user)
45
+ Devise.secure_compare(
46
+ user.sign_in_token,
47
+ Devise.token_generator.digest(Magic::Link.user_class, :sign_in_token, params[:sign_in_token])
48
+ )
49
+ end
50
+
51
+ def token_not_expired?(user)
52
+ user.sign_in_token_sent_at >= Magic::Link.token_expiration_hours.hours.ago
53
+ end
54
+
24
55
  def permitted_params
25
56
  params.fetch(:magic_link, {}).permit(:email)
26
57
  end
@@ -1,5 +1,5 @@
1
1
  <p>Hey there! Here is your sign in link (you can only use it once):</p>
2
2
 
3
- <p><%= link_to "Sign In", main_app.root_url(email: @email, sign_in_token: @token) %></p>
3
+ <p><%= link_to "Sign In", magic_link.authenticate_url(email: @email, sign_in_token: @token) %></p>
4
4
 
5
5
  <p>Thanks!</p>
@@ -1,5 +1,5 @@
1
1
  Hey there! Here is your sign in link (you can only use it once):
2
2
 
3
- <%= main_app.root_url(email: @email, sign_in_token: @token) %>
3
+ <%= magic_link.authenticate_url(email: @email, sign_in_token: @token) %>
4
4
 
5
5
  Thanks!
data/config/routes.rb CHANGED
@@ -1,3 +1,4 @@
1
1
  Magic::Link::Engine.routes.draw do
2
2
  resources :magic_links, only: [:new, :create]
3
+ get "/magic_links/authenticate", to: "magic_links#authenticate", as: :authenticate
3
4
  end
data/lib/magic/link.rb CHANGED
@@ -1,5 +1,4 @@
1
1
  require "magic/link/engine"
2
- require "magic/link/controller_extensions"
3
2
  require "magic/link/railtie"
4
3
 
5
4
  module Magic
@@ -13,6 +12,9 @@ module Magic
13
12
  mattr_accessor :token_expiration_hours
14
13
  @@token_expiration_hours = 6
15
14
 
15
+ mattr_accessor :after_sign_in_path
16
+ @@after_sign_in_path = "root_path"
17
+
16
18
  class << self
17
19
  def configure
18
20
  yield self
@@ -2,9 +2,7 @@ module Magic
2
2
  module Link
3
3
  class Railtie < ::Rails::Railtie
4
4
  config.to_prepare do
5
- ::ApplicationController.send(:include, Magic::Link::ControllerExtensions)
6
5
  ::ApplicationController.send(:helper, Magic::Link::ApplicationHelper)
7
- ::ApplicationController.send(:before_action, :authenticate_user_from_token!)
8
6
  end
9
7
  end
10
8
  end
@@ -1,5 +1,5 @@
1
1
  module Magic
2
2
  module Link
3
- VERSION = '0.3.0'
3
+ VERSION = '1.0.0'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: magic-link
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Van Der Beek
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-04-29 00:00:00.000000000 Z
11
+ date: 2020-05-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -77,7 +77,6 @@ files:
77
77
  - app/views/magic/link/magic_links/new.html.erb
78
78
  - config/routes.rb
79
79
  - lib/magic/link.rb
80
- - lib/magic/link/controller_extensions.rb
81
80
  - lib/magic/link/engine.rb
82
81
  - lib/magic/link/railtie.rb
83
82
  - lib/magic/link/version.rb
@@ -1,39 +0,0 @@
1
- module Magic
2
- module Link
3
- module ControllerExtensions
4
- def self.included(base)
5
- base.send(:include, InstanceMethods)
6
- end
7
-
8
- module InstanceMethods
9
- def authenticate_user_from_token!
10
- email = params[:email].presence
11
- token = params[:sign_in_token].presence
12
- user = email && token && Magic::Link.user_class.find_by(email: email)
13
-
14
- if token && send("#{Magic::Link.user_class.name.underscore}_signed_in?")
15
- flash.now[:alert] = "You are already signed in"
16
- elsif user && token_matches?(user) && token_not_expired?(user)
17
- flash[:notice] = "You have signed in successfully"
18
- user.update_columns(sign_in_token: nil, sign_in_token_sent_at: nil)
19
- sign_in user
20
- elsif email && token
21
- flash[:alert] = "Your sign in token is invalid"
22
- redirect_to main_app.root_path
23
- end
24
- end
25
-
26
- def token_matches?(user)
27
- Devise.secure_compare(
28
- user.sign_in_token,
29
- Devise.token_generator.digest(Magic::Link.user_class, :sign_in_token, params[:sign_in_token])
30
- )
31
- end
32
-
33
- def token_not_expired?(user)
34
- user.sign_in_token_sent_at >= Magic::Link.token_expiration_hours.hours.ago
35
- end
36
- end
37
- end
38
- end
39
- end