no_password_auth 0.2.1
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 +7 -0
- data/MIT-LICENSE +20 -0
- data/README-ES.md +230 -0
- data/README.md +230 -0
- data/Rakefile +18 -0
- data/app/assets/config/no_password/manifest.js +4 -0
- data/app/assets/config/no_password/tailwind.config.js +61 -0
- data/app/assets/images/no_password/aoo.svg +1 -0
- data/app/assets/javascripts/no_password/application.js +4 -0
- data/app/assets/javascripts/no_password/controllers/alert_controller.js +31 -0
- data/app/assets/javascripts/no_password/controllers/application.js +10 -0
- data/app/assets/javascripts/no_password/controllers/index.js +11 -0
- data/app/assets/stylesheets/no_password/application.css +15 -0
- data/app/assets/stylesheets/no_password/application.tailwind.css +34 -0
- data/app/controllers/concerns/no_password/controller_helpers.rb +45 -0
- data/app/controllers/concerns/no_password/web_tokens.rb +33 -0
- data/app/controllers/no_password/application_controller.rb +4 -0
- data/app/controllers/no_password/session_confirmations_controller.rb +46 -0
- data/app/controllers/no_password/sessions_controller.rb +49 -0
- data/app/helpers/no_password/application_helper.rb +4 -0
- data/app/helpers/no_password/no_password_helper.rb +13 -0
- data/app/jobs/no_password/application_job.rb +4 -0
- data/app/mailers/no_password/application_mailer.rb +6 -0
- data/app/mailers/no_password/sessions_mailer.rb +16 -0
- data/app/models/no_password/application_record.rb +5 -0
- data/app/models/no_password/session.rb +20 -0
- data/app/use_cases/no_password/session_manager.rb +51 -0
- data/app/views/layouts/no_password/application.html.erb +26 -0
- data/app/views/layouts/no_password/mailer.html.erb +106 -0
- data/app/views/layouts/no_password/mailer.text.erb +6 -0
- data/app/views/no_password/application/_notification.html.erb +55 -0
- data/app/views/no_password/session_confirmations/_form.html.erb +19 -0
- data/app/views/no_password/session_confirmations/edit.html.erb +15 -0
- data/app/views/no_password/session_confirmations/update.turbo_stream.erb +3 -0
- data/app/views/no_password/sessions/_form.html.erb +16 -0
- data/app/views/no_password/sessions/create.turbo_stream.erb +3 -0
- data/app/views/no_password/sessions/new.html.erb +15 -0
- data/app/views/no_password/sessions_mailer/send_token.html.erb +14 -0
- data/app/views/no_password/sessions_mailer/send_token.text.erb +12 -0
- data/config/initializers/importmap.rb +17 -0
- data/config/locales/en/flash.en.yml +11 -0
- data/config/locales/en/forms.en.yml +9 -0
- data/config/locales/en/mailers.en.yml +21 -0
- data/config/locales/en/views.en.yml +12 -0
- data/config/locales/es/flash.es.yml +11 -0
- data/config/locales/es/forms.es.yml +9 -0
- data/config/locales/es/mailers.es.yml +18 -0
- data/config/locales/es/views.es.yml +13 -0
- data/config/locales/models.en.yml +8 -0
- data/config/locales/models.es.yml +8 -0
- data/config/locales/models.yml +8 -0
- data/config/routes.rb +7 -0
- data/db/migrate/20211202211706_create_no_password_sessions.rb +16 -0
- data/docs/aoorora-demo.gif +0 -0
- data/docs/dummy-app.png +0 -0
- data/lib/generators/no_password/install_generator.rb +30 -0
- data/lib/generators/no_password/install_templates_generator.rb +27 -0
- data/lib/generators/no_password/tailwind_config_generator.rb +9 -0
- data/lib/generators/no_password/templates/app/assets/config/no_password/tailwind.config.js.tt +57 -0
- data/lib/generators/no_password/templates/config/initializers/no_password.rb +10 -0
- data/lib/no_password/engine.rb +11 -0
- data/lib/no_password/railtie.rb +7 -0
- data/lib/no_password/version.rb +3 -0
- data/lib/no_password.rb +42 -0
- data/lib/tasks/install.rake +17 -0
- data/lib/tasks/no_password_tasks.rake +4 -0
- data/lib/tasks/tailwind.rake +23 -0
- metadata +227 -0
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "no_password"
|
4
|
+
|
5
|
+
NoPassword.configuration.importmap.draw do
|
6
|
+
# Stimulus & Turbo
|
7
|
+
pin "@hotwired/turbo-rails", to: "turbo.min.js", preload: true
|
8
|
+
pin "@hotwired/stimulus", to: "stimulus.min.js", preload: true
|
9
|
+
pin "@hotwired/stimulus-loading", to: "stimulus-loading.js", preload: true
|
10
|
+
pin "stimulus-use", to: "https://ga.jspm.io/npm:stimulus-use@0.50.0-2/dist/index.js"
|
11
|
+
pin "hotkeys-js", to: "https://ga.jspm.io/npm:hotkeys-js@3.8.7/dist/hotkeys.esm.js"
|
12
|
+
|
13
|
+
# NoPassword entrypoint
|
14
|
+
pin "application", to: "no_password/application.js", preload: true
|
15
|
+
|
16
|
+
pin_all_from NoPassword::Engine.root.join("app/assets/javascripts/no_password/controllers"), under: "controllers", to: "no_password/controllers"
|
17
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
en:
|
2
|
+
flash:
|
3
|
+
update:
|
4
|
+
invalid_code:
|
5
|
+
alert:
|
6
|
+
title: Token in invalid
|
7
|
+
description: Check your token, it maybe expired. Request a new one if you are unable to start a session.
|
8
|
+
session:
|
9
|
+
alert:
|
10
|
+
title: Unauthorized
|
11
|
+
description: Start a session to continue.
|
@@ -0,0 +1,21 @@
|
|
1
|
+
en:
|
2
|
+
layouts:
|
3
|
+
no_password:
|
4
|
+
mailer:
|
5
|
+
service: Service provided by
|
6
|
+
platform: The banking core platform on which to run your financial business.
|
7
|
+
from: no-reply@aoorora.com
|
8
|
+
mailer:
|
9
|
+
from: no-reply@aoorora.com
|
10
|
+
|
11
|
+
mailers:
|
12
|
+
default_from: no-reply@aoorora.com
|
13
|
+
|
14
|
+
send_token:
|
15
|
+
subject: Here is your temporary login token
|
16
|
+
greetings: Hello!
|
17
|
+
instructions_1: You requested a login token to start a new session. Here is your code. You can copy/paste the code into our website. Please don't share this code to anyone.
|
18
|
+
instructions_2: Or use this button to start a new session. It will open a new browser window.
|
19
|
+
instructions_2_text: Or use the follwing link to start a new session. Copy and paste it your browser.
|
20
|
+
start_session: Continue to your session
|
21
|
+
instructions_3: If you did not request this email, please ignore and delete it. Do not resend or share it with other people.
|
@@ -0,0 +1,12 @@
|
|
1
|
+
en:
|
2
|
+
no_password:
|
3
|
+
sessions:
|
4
|
+
new:
|
5
|
+
title: New session
|
6
|
+
description: Enter your email below to receive a code and a link to log in.
|
7
|
+
|
8
|
+
session_confirmations:
|
9
|
+
edit:
|
10
|
+
title: Confirm your session
|
11
|
+
description: We sent you an email. Use the code on it to continue or use the link provided. Check your spam folder if you can't find our email in your inbox.
|
12
|
+
request_token: Request new token
|
@@ -0,0 +1,11 @@
|
|
1
|
+
es:
|
2
|
+
flash:
|
3
|
+
update:
|
4
|
+
invalid_code:
|
5
|
+
alert:
|
6
|
+
title: Código inválido
|
7
|
+
description: Revise su código no es válido o ya expiró. Puede solicitar uno nuevo.
|
8
|
+
session:
|
9
|
+
alert:
|
10
|
+
title: No existe sesión activa
|
11
|
+
description: Inicie una sesión para continuar.
|
@@ -0,0 +1,18 @@
|
|
1
|
+
es:
|
2
|
+
layouts:
|
3
|
+
no_password:
|
4
|
+
mailer:
|
5
|
+
service: Servicio de Aoorora
|
6
|
+
platform: La plataforma de core bancario sobre la cual ejecutar tu negocio financiero.
|
7
|
+
|
8
|
+
mailers:
|
9
|
+
default_from: no-reply@aoorora.com
|
10
|
+
|
11
|
+
send_token:
|
12
|
+
subject: Su código de sesión temporal está aquí.
|
13
|
+
greetings: Hola!
|
14
|
+
instructions_1: Usted solicitó un código de acceso a nuestro servicio. Su código temporal es el siguiente. Copie y pegue el código en nuestro sition. Por favor no comparta el código con otras personas.
|
15
|
+
instructions_2: O puede iniciar sesión automáticamente con el siguiente botón. Se abrirá una nueva ventana en su navegador.
|
16
|
+
instructions_2_text: O puede iniciar sesión automáticamente con el siguiente vínculo. Cópielo y péguelo en su navegador.
|
17
|
+
instructions_3: Si usted no solicitó este correo, por favor haga caso omiso de él y eliminelo. No lo reenvie o comparta con otras personas.
|
18
|
+
start_session: Continuar a su sessión
|
@@ -0,0 +1,13 @@
|
|
1
|
+
es:
|
2
|
+
no_password:
|
3
|
+
sessions:
|
4
|
+
new:
|
5
|
+
title: Nueva sesión
|
6
|
+
description: Introduzca su correo electrónico para recibir un código y un enlace mágico para iniciar sesión.
|
7
|
+
|
8
|
+
session_confirmations:
|
9
|
+
edit:
|
10
|
+
title: Iniciar sesión
|
11
|
+
description: Utilice el código o la URL que recibió en su correo. Si no lo encuentra, búsquelo en la bandeja de Spam.
|
12
|
+
submit: Iniciar sesión
|
13
|
+
request_token: Solicitar nuevo código
|
data/config/routes.rb
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
NoPassword::Engine.routes.draw do
|
2
|
+
resource :session, only: [:new, :create, :destroy]
|
3
|
+
|
4
|
+
get "/confirmations/:token", to: "session_confirmations#edit", as: :session_confirmation
|
5
|
+
get "/confirmations", to: "session_confirmations#edit", as: :edit_session_confirmations
|
6
|
+
resource :session_confirmations, path: :confirmations, only: [:edit, :update]
|
7
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class CreateNoPasswordSessions < ActiveRecord::Migration[7.0]
|
2
|
+
def change
|
3
|
+
create_table :no_password_sessions, if_not_exists: true do |t|
|
4
|
+
|
5
|
+
t.timestamp :expires_at
|
6
|
+
t.timestamp :claimed_at
|
7
|
+
t.string :token, null: false
|
8
|
+
t.string :user_agent, null: false
|
9
|
+
t.string :remote_addr, null: false
|
10
|
+
t.string :return_url
|
11
|
+
t.string :email, null: false
|
12
|
+
|
13
|
+
t.timestamps
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
Binary file
|
data/docs/dummy-app.png
ADDED
Binary file
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module NoPassword
|
2
|
+
class InstallGenerator < Rails::Generators::Base
|
3
|
+
source_root File.expand_path("../templates", __FILE__)
|
4
|
+
|
5
|
+
def create_initializer_file
|
6
|
+
template "config/initializers/no_password.rb"
|
7
|
+
end
|
8
|
+
|
9
|
+
def add_route
|
10
|
+
return if Rails.application.routes.routes.detect { |route| route.app.app == NoPassword::Engine }
|
11
|
+
route %(mount NoPassword::Engine => "/p")
|
12
|
+
end
|
13
|
+
|
14
|
+
def add_concerns
|
15
|
+
inject_into_file "app/controllers/application_controller.rb", after: "ActionController::Base" do
|
16
|
+
<<~EOF
|
17
|
+
\n include NoPassword::ControllerHelpers
|
18
|
+
EOF
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def copy_migrations
|
23
|
+
rake "no_password:install:migrations"
|
24
|
+
end
|
25
|
+
|
26
|
+
def build_tailwind
|
27
|
+
rake "no_password:tailwindcss:build"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module NoPassword
|
2
|
+
class InstallTemplatesGenerator < Rails::Generators::Base
|
3
|
+
source_root File.expand_path("../../../app/views", __FILE__)
|
4
|
+
|
5
|
+
def copy_layout
|
6
|
+
empty_directory "app/views/layouts/no_password"
|
7
|
+
directory File.join(engine_views_path, "layouts", "no_password"),
|
8
|
+
File.join(app_views_path, "layouts", "no_password")
|
9
|
+
end
|
10
|
+
|
11
|
+
def copy_views
|
12
|
+
empty_directory "app/views/no_password"
|
13
|
+
directory File.join(engine_views_path, "no_password"),
|
14
|
+
File.join(app_views_path, "no_password")
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def engine_views_path
|
20
|
+
@engine_views_path ||= File.join(NoPassword::Engine.root, "app", "views")
|
21
|
+
end
|
22
|
+
|
23
|
+
def app_views_path
|
24
|
+
@app_views_path ||= File.join(Rails.root, "app", "views")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
const defaultTheme = require('tailwindcss/defaultTheme')
|
2
|
+
|
3
|
+
function withOpacityValue(variableName) {
|
4
|
+
return ({opacityValue}) => {
|
5
|
+
opacityValue = opacityValue ?? 1;
|
6
|
+
return `rgba(var(${variableName}), ${opacityValue})`
|
7
|
+
}
|
8
|
+
};
|
9
|
+
|
10
|
+
module.exports = {
|
11
|
+
content: [
|
12
|
+
<%= NoPassword.configuration.tailwind_content.map{|path| "'#{path}'"}.join(",\n") %>
|
13
|
+
],
|
14
|
+
theme: {
|
15
|
+
extend: {
|
16
|
+
fontFamily: {
|
17
|
+
sans: ['Inter var', ...defaultTheme.fontFamily.sans],
|
18
|
+
},
|
19
|
+
textColor: {
|
20
|
+
skin: {
|
21
|
+
inverted: withOpacityValue('--color-inverted'),
|
22
|
+
accented: withOpacityValue('--color-accented'),
|
23
|
+
'accented-hover': withOpacityValue('--color-accented-hover'),
|
24
|
+
base: withOpacityValue('--color-base'),
|
25
|
+
muted: withOpacityValue('--color-muted'),
|
26
|
+
dimmed: withOpacityValue('--color-dimmed'),
|
27
|
+
error: withOpacityValue('--color-error'),
|
28
|
+
}
|
29
|
+
},
|
30
|
+
backgroundColor: {
|
31
|
+
skin: {
|
32
|
+
'button-accented': withOpacityValue('--color-accented'),
|
33
|
+
'button-accented-hover': withOpacityValue('--color-accented-hover'),
|
34
|
+
'button-inverted': withOpacityValue('--color-inverted'),
|
35
|
+
'button-inverted-hover': withOpacityValue('--color-inverted-hover'),
|
36
|
+
muted: withOpacityValue('--color-muted'),
|
37
|
+
dimmed: withOpacityValue('--color-dimmed'),
|
38
|
+
accent: withOpacityValue('--color-accent'),
|
39
|
+
}
|
40
|
+
},
|
41
|
+
ringColor: {
|
42
|
+
skin: {
|
43
|
+
accented: withOpacityValue('--color-border-accented'),
|
44
|
+
}
|
45
|
+
},
|
46
|
+
borderColor: {
|
47
|
+
skin: {
|
48
|
+
base: withOpacityValue('--color-border-base'),
|
49
|
+
accented: withOpacityValue('--color-border-accented'),
|
50
|
+
}
|
51
|
+
}
|
52
|
+
},
|
53
|
+
},
|
54
|
+
plugins: [
|
55
|
+
require('@tailwindcss/forms')
|
56
|
+
],
|
57
|
+
}
|
@@ -0,0 +1,10 @@
|
|
1
|
+
NoPassword.configure do |config|
|
2
|
+
# Session expiration time
|
3
|
+
# config.session_expiration = 2.hours
|
4
|
+
#
|
5
|
+
# Token expiration time
|
6
|
+
# config.token_expiration = 15.minutes
|
7
|
+
#
|
8
|
+
# Secret key to cypher tokens, if none, then Rails secret key is used
|
9
|
+
# config.secret_key = nil
|
10
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require "importmap-rails"
|
2
|
+
|
3
|
+
module NoPassword
|
4
|
+
class Engine < ::Rails::Engine
|
5
|
+
isolate_namespace NoPassword
|
6
|
+
|
7
|
+
initializer "no_password.importmap", before: "importmap" do |app|
|
8
|
+
app.config.importmap.paths << Engine.root.join("config/initializers/importmap.rb")
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
data/lib/no_password.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "no_password/version"
|
4
|
+
require "no_password/engine"
|
5
|
+
require "no_password/railtie"
|
6
|
+
require "importmap-rails"
|
7
|
+
|
8
|
+
module NoPassword
|
9
|
+
class << self
|
10
|
+
attr_accessor :configuration
|
11
|
+
end
|
12
|
+
|
13
|
+
class Configuration
|
14
|
+
attr_accessor :session_expiration, :token_expiration, :secret_key, :tailwind_content, :importmap
|
15
|
+
|
16
|
+
def initialize
|
17
|
+
@session_expiration = 2.hours
|
18
|
+
@token_expiration = 15.minutes
|
19
|
+
@secret_key = nil
|
20
|
+
@importmap = Importmap::Map.new
|
21
|
+
|
22
|
+
@tailwind_content = [
|
23
|
+
"#{NoPassword::Engine.root}/app/views/**/*",
|
24
|
+
"#{NoPassword::Engine.root}/app/helpers/**/*",
|
25
|
+
"#{NoPassword::Engine.root}/app/controllers/**/*",
|
26
|
+
"#{NoPassword::Engine.root}/app/javascript/**/*.js",
|
27
|
+
"#{NoPassword::Engine.root}/app/assets/**/application.tailwind.css"
|
28
|
+
]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.init_config
|
33
|
+
self.configuration ||= Configuration.new
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.configure
|
37
|
+
init_config
|
38
|
+
yield(configuration)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
NoPassword.init_config
|
@@ -0,0 +1,17 @@
|
|
1
|
+
namespace :no_password do
|
2
|
+
desc "Install No Password"
|
3
|
+
task install: :environment do
|
4
|
+
ActiveRecord::Base.connection
|
5
|
+
rescue ActiveRecord::NoDatabaseError
|
6
|
+
puts "ERROR: database does not exist, run 'rails db:create' first"
|
7
|
+
else
|
8
|
+
Rails::Command.invoke :generate, ["no_password:install"]
|
9
|
+
end
|
10
|
+
|
11
|
+
namespace :install do
|
12
|
+
desc "Copy templates from no_password to application"
|
13
|
+
task copy_templates: :environment do
|
14
|
+
Rails::Command.invoke :generate, ["no_password:install_templates"]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require "tailwindcss-rails"
|
2
|
+
|
3
|
+
NO_PASSWORD_TAILWIND_COMPILE_COMMAND = "#{Tailwindcss::Engine.root.join("exe/tailwindcss")} -i #{NoPassword::Engine.root.join("app/assets/stylesheets/no_password/application.tailwind.css")} -o #{Rails.root.join("app/assets/builds", "no_password/tailwind.css")} -c #{Rails.root.join("app/assets/config/no_password/tailwind.config.js")}"
|
4
|
+
|
5
|
+
namespace :no_password do
|
6
|
+
namespace :tailwindcss do
|
7
|
+
desc "Build your Tailwind CSS"
|
8
|
+
task :build do
|
9
|
+
Rails::Generators.invoke("no_password:tailwind_config", ["--force"])
|
10
|
+
system NO_PASSWORD_TAILWIND_COMPILE_COMMAND
|
11
|
+
end
|
12
|
+
|
13
|
+
desc "Watch and build your Tailwind CSS"
|
14
|
+
task :watch do
|
15
|
+
Rails::Generators.invoke("no_password:tailwind_config", ["--force"])
|
16
|
+
system "#{NO_PASSWORD_TAILWIND_COMPILE_COMMAND} -w"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
if Rake::Task.task_defined?("assets:precompile")
|
22
|
+
Rake::Task["assets:precompile"].enhance(["no_password:tailwindcss:build"])
|
23
|
+
end
|