Ruby On Rails 및 Devise를 사용한 매직 링크

14697 단어 railsruby
암호는 사용자에게 문제입니다. 이를 건너뛰는 좋은 방법은 이메일로 계정에 대한 액세스 링크를 보내는 것입니다. 해당 링크에는 우리가 유효성을 검사하고 마지막으로 사용자 계정에 로그인하는 데 사용할 토큰이 있습니다. 다음으로 Devise와 함께 Ruby On Rails 6에서의 구현을 보여드리겠습니다.

참고: 실수를 피하기 위해 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 installDevise를 설치하자: 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 %>


좋아, 그게 다야 읽어 주셔서 감사합니다. 👋

좋은 웹페이지 즐겨찾기