authentication-zero 2.16.23 → 2.16.25

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: 3a209eab7a18b13d85da9a5590911a93b62bd7706e5479c31d4b336c20bdeb82
4
- data.tar.gz: 2db4995530e23797b10116f163a814124a61b654be4237dbf9bfadbc0c7d67e5
3
+ metadata.gz: 7e2f92cea6894605d40f9db5bad75a4cb227a89043a19f8fe79172b83731b226
4
+ data.tar.gz: 85801b84481982cabfc5d1bbbbc554893d4597ed70a7550f1f4e299f8b4b81ae
5
5
  SHA512:
6
- metadata.gz: 997b3dccdf8e4293d7f0d7dba947d7c5f7e5dafd8811c605e18ba6780970cf294082c67a3a9bf626dbbf18e2fb7ff8cfbd704ff4c56feae305de08919b0b493d
7
- data.tar.gz: d4fecb6e1214271795a536b7abd4d7cb0bcc2a055d97cef197842211b6ced3b712c48aeaf4086465af230dd1e0fe0f027451019239c8a96cec00270ffd7fea47
6
+ metadata.gz: cc3bddc51a3cbe07dc2dd990ae65b9692699f3dad8d370da99952ee7cedb3c6d31699ee7804e5c0b5b0ff8a8e5b05182a9a1c40d58d04c364d7171f53c193b8d
7
+ data.tar.gz: 07bccc4f5eb51fac1da60e82bd3f819f2b29aec97085d73fd13d819ed69b81a704b12bd866e2340b6641ee860563d49a67bea43854a2efa0da23004c9501a598
data/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ ## Authentication Zero 2.16.25 ##
2
+
3
+ * Add new option to refresh otp secret
4
+
5
+ ## Authentication Zero 2.16.24 ##
6
+
7
+ * Remove otp secret from client
8
+
1
9
  ## Authentication Zero 2.16.21 ##
2
10
 
3
11
  * Add two factor authentication using a hardware security key (--webauthn)
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- authentication-zero (2.16.23)
4
+ authentication-zero (2.16.25)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -1,3 +1,3 @@
1
1
  module AuthenticationZero
2
- VERSION = "2.16.23"
2
+ VERSION = "2.16.25"
3
3
  end
@@ -117,7 +117,8 @@ class AuthenticationGenerator < Rails::Generators::Base
117
117
 
118
118
  def install_javascript_dependencies
119
119
  return if options.api?
120
- template "javascript/controllers/application.js", "app/javascript/controllers/application.js"
120
+
121
+ template "javascript/controllers/application.js", "app/javascript/controllers/application.js", force: true
121
122
 
122
123
  if webauthn?
123
124
  run "bin/importmap pin stimulus-web-authn" if importmaps?
@@ -195,7 +196,7 @@ class AuthenticationGenerator < Rails::Generators::Base
195
196
 
196
197
  if two_factor?
197
198
  route "resources :recovery_codes, only: [:index, :create]", namespace: [:two_factor_authentication, :profile]
198
- route "resource :totp, only: [:new, :create]", namespace: [:two_factor_authentication, :profile]
199
+ route "resource :totp, only: [:new, :create, :update]", namespace: [:two_factor_authentication, :profile]
199
200
  route "resources :security_keys", namespace: [:two_factor_authentication, :profile] if webauthn?
200
201
 
201
202
  route "resource :recovery_codes, only: [:new, :create]", namespace: [:two_factor_authentication, :challenge]
@@ -16,7 +16,7 @@ class SessionsController < ApplicationController
16
16
 
17
17
  if user && user.authenticate(params[:password])
18
18
  <%- if two_factor? -%>
19
- if user.otp_secret.present?
19
+ if user.otp_required_for_sign_in?
20
20
  session[:challenge_token] = user.signed_id(purpose: :authentication_challenge, expires_in: 20.minutes)
21
21
  redirect_to new_two_factor_authentication_challenge_totp_path
22
22
  else
@@ -1,26 +1,35 @@
1
1
  class TwoFactorAuthentication::Profile::TotpsController < ApplicationController
2
2
  before_action :set_user
3
- before_action :set_totp
3
+ before_action :set_totp, only: %i[ new create ]
4
4
 
5
5
  def new
6
- @qr_code = RQRCode::QRCode.new(@totp.provisioning_uri(@user.email))
6
+ @qr_code = RQRCode::QRCode.new(provisioning_uri)
7
7
  end
8
8
 
9
9
  def create
10
10
  if @totp.verify(params[:code], drift_behind: 15)
11
- @user.update! otp_secret: params[:secret]
11
+ @user.update! otp_required_for_sign_in: true
12
12
  redirect_to two_factor_authentication_profile_recovery_codes_path
13
13
  else
14
14
  redirect_to new_two_factor_authentication_profile_totp_path, alert: "That code didn't work. Please try again"
15
15
  end
16
16
  end
17
17
 
18
+ def update
19
+ @user.update! otp_secret: ROTP::Base32.random
20
+ redirect_to new_two_factor_authentication_profile_totp_path
21
+ end
22
+
18
23
  private
19
24
  def set_user
20
25
  @user = Current.user
21
26
  end
22
27
 
23
28
  def set_totp
24
- @totp = ROTP::TOTP.new(params[:secret] || ROTP::Base32.random, issuer: "YourAppName")
29
+ @totp = ROTP::TOTP.new(@user.otp_secret, issuer: "YourAppName")
30
+ end
31
+
32
+ def provisioning_uri
33
+ @totp.provisioning_uri @user.email
25
34
  end
26
35
  end
@@ -16,7 +16,7 @@
16
16
  <%%= link_to "Two-Factor Authentication", new_two_factor_authentication_profile_totp_path %>
17
17
  </div>
18
18
 
19
- <%% if Current.user.otp_secret.present? %>
19
+ <%% if Current.user.otp_required_for_sign_in? %>
20
20
  <div><%%= link_to "Recovery Codes", two_factor_authentication_profile_recovery_codes_path %></div>
21
21
  <%- if webauthn? -%>
22
22
  <div><%%= link_to "Security keys", two_factor_authentication_profile_security_keys_path %></div>
@@ -1,5 +1,17 @@
1
1
  <p style="color: red"><%%= alert %></p>
2
2
 
3
+ <%% if Current.user.otp_required_for_sign_in? %>
4
+ <h1>Want to replace your existing 2FA setup?</h1>
5
+
6
+ <p>Your account is already protected with two-factor authentication. You can replace that setup if you want to switch to a new phone or authenticator app.</p>
7
+
8
+ <p><strong>Do you want to continue? Your existing 2FA setup will no longer work.</strong></p>
9
+
10
+ <%%= button_to "Yes, replace my 2FA setup", two_factor_authentication_profile_totp_path, method: :patch %>
11
+
12
+ <hr>
13
+ <%% end %>
14
+
3
15
  <h1>Upgrade your security with 2FA</h1>
4
16
 
5
17
  <h2>Step 1: Get an Authenticator App</h2>
@@ -15,8 +27,6 @@
15
27
  </figure>
16
28
 
17
29
  <%%= form_with(url: two_factor_authentication_profile_totp_path) do |form| %>
18
- <%%= form.hidden_field :secret, value: @totp.secret %>
19
-
20
30
  <div>
21
31
  <%%= form.label :code, "After scanning with your camera, the app will generate a six-digit code. Enter it here:", style: "display: block" %>
22
32
  <%%= form.text_field :code, required: true, autofocus: true, autocomplete: :off %>
@@ -6,10 +6,11 @@ class <%= migration_class_name %> < ActiveRecord::Migration[<%= ActiveRecord::Mi
6
6
 
7
7
  t.boolean :verified, null: false, default: false
8
8
  <%- if two_factor? %>
9
- t.string :otp_secret
9
+ t.boolean :otp_required_for_sign_in, null: false, default: false
10
+ t.string :otp_secret, null: false
10
11
  <%- end -%>
11
12
  <%- if webauthn? %>
12
- t.string :webauthn_id
13
+ t.string :webauthn_id, null: false
13
14
  <%- end -%>
14
15
  <%- if omniauthable? %>
15
16
  t.string :provider
@@ -30,8 +30,13 @@ class User < ApplicationRecord
30
30
  before_validation if: :email_changed?, on: :update do
31
31
  self.verified = false
32
32
  end
33
+ <%- if two_factor? %>
34
+ before_create do
35
+ self.otp_secret = ROTP::Base32.random
36
+ end
37
+ <%- end -%>
33
38
  <%- if webauthn? %>
34
- before_validation on: :create do
39
+ before_create do
35
40
  self.webauthn_id = WebAuthn.generate_user_id
36
41
  end
37
42
  <%- end -%>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: authentication-zero
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.16.23
4
+ version: 2.16.25
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nixon
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-04-12 00:00:00.000000000 Z
11
+ date: 2023-04-13 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email: