Ruby On Rails 및 Devise를 사용한 매직 링크
참고: 실수를 피하기 위해 0부터 응용 프로그램을 만들 것입니다.
설정
프로젝트 생성:
$ rails new magicLinks -T --skip-turbokinks --database=postgresql
종속성 설치 중...
이것을 귀하의
Gemfile.rb
에 추가하십시오.gem 'devise', '~> 4.7', '>= 4.7.1'
group :development, :test do
gem 'letter_opener', '~> 1.7' // For open emails in the browser
end
그럼,
$ bundle install
Devise를 설치하자: with$ rails g devise:install && rails g devise User && rails db:create && rails db:migrate
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
config.action_mailer.delivery_method = :letter_opener
Devise는 우리에게 루트 경로를 묻습니다. 그렇게 합시다:
$ rails g controller welcome index
.app/config/routes.rb
에 다음을 추가하십시오.root 'welcome#index'
해보자👊
먼저 생성된 토큰을 db에 저장하기 위한 테이블을 만들어야 합니다.
그래서,
$ rails g model EmailLink token expires_at:datetime user:references && rails db:migrate
이제 우리는 토큰을 생성하고 이런 일이 발생하면
app/models/email_link.rb
에서 이메일을 보낼 것입니다.class EmailLink < ApplicationRecord
belongs_to :user
after_create :send_mail
def self.generate(email)
user = User.find_by(email: email)
return nil if !user
create(user: user, expires_at: Date.today + 1.day, token: generate_token)
end
def self.generate_token
Devise.friendly_token.first(16)
end
private
def send_mail
EmailLinkMailer.sign_in_mail(self).deliver_now
end
end
사용자가 이메일을 제공하고
rails g controller EmailLinks new create
양식을 보낼 때 이전 콜백을 트리거하는 컨트롤러를 생성해 보겠습니다.app/config/routes.rb
에 필요한 경로를 추가해 보겠습니다.root 'welcome#index'
get 'email_links/new', as: :new_magic_link
post 'email_links/create', as: :magic_link
get 'email_links/validate', as: :email_link
이제 컨트롤러에 기능을 부여해 보겠습니다.
class EmailLinksController < ApplicationController
def new
end
def create
@email_link = EmailLink.generate(params[:email])
if @email_link
flash[:notice] = "Email sent! Please, check your inbox."
redirect_to root_path
else
flash[:alert] = "There was an error, please try again!"
redirect_to new_magic_link_path
end
end
def validate
email_link = EmailLink.where(token: params[:token]).where("expires_at > ?", DateTime.now).first
unless email_link
flash[:alert] = "Invalid or expired token!"
redirect_to new_magic_link_path
end
sign_in(email_link.user, scope: :user)
redirect_to root_path
end
end
이 시점에서 우리 프로그램은 토큰을 생성하고 유효성을 검사하고 로그인할 수 있습니다. 남은 것은 이메일을 보내고 사용자가 이메일을 제공하는 보기입니다.
참고: 이러한 경고를 보려면 body 태그 내부의
app/views/layouts/application.html.erb
에 경고를 추가해야 합니다.<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>
이메일 보내기
매우 쉽습니다. 먼저 메일러
$ rails g mailer EmailLinkMailer
를 생성한 다음 기능을 제공합니다.class EmailLinkMailer < ApplicationMailer
def sign_in_mail(email_link)
@token = email_link.token
@user = email_link.user
mail to: @user.email, subject: "Here is your magic link! 🚀"
end
end
이메일(
app/views/email_link_mailer/sign_in_mail.html.erb
)을 약간 수정해 보겠습니다.<p>Hello, <%= @user.email %>!</p>
<p>Recently someone requested a link to enter your account, if it was you, just press the button below to log in</p>
<%= link_to "Sign in to my account", email_link_url(token: @token) %>
훌륭한! 이 시점에서 우리 프로그램은 이미 이메일을 보낼 수 있습니다. 사용자가 이메일을 제공하고 이 모든 백엔드를 실행할 수 있는 기본 보기만 있으면 됩니다.
이 간단한 양식을
app/views/email_links/new.html.erb
에 추가하기만 하면 됩니다.<%= form_with(url: magic_link_path, method: :post) do %>
<%= label_tag :email, "E-mail address" %>
<%= email_field_tag :email, nil, placeholder:"carpintinimatias@gmail.com", autofocus: true, required: true %>
<%= submit_tag "Send!" %>
<% end %>
이것이 작동하는지 확인하기 위해
app/views/welcome/index.html.erb
에 이 더미 예제를 추가할 수 있습니다.<% if user_signed_in? %>
<p>Hello, <%= current_user.email %></p>
<%= link_to "Sign out", destroy_user_session_path, method: :delete %>
<% else %>
<p>Hey, Sign In with Magic Links!</p>
<%= link_to "Click here", new_magic_link_path %>
<% end %>
좋아, 그게 다야 읽어 주셔서 감사합니다. 👋
Reference
이 문제에 관하여(Ruby On Rails 및 Devise를 사용한 매직 링크), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/matiascarpintini/magic-links-with-ruby-on-rails-and-devise-4e3o텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)