برنامه نویسی

تأیید ایمیل با کدهای ارسال شده در Ruby on Rails بدون طراحی

سلام ، ما می دانیم که تأیید ایمیل در بسیاری از برنامه های زندگی روزمره ما وجود دارد. از طریق آن است که ما شهرت فرستنده را بهبود می بخشیم و از همه مهمتر جلوگیری از جعل هویت. با توجه به این ، من در جامعه ریلز دیدم که استفاده از Devise کاملاً متداول است ، اما اگر می خواستید چیزی را از ابتدا اجرا کنید ، چه می کنید؟ چگونه آن را انجام می دهید؟ امروز ، من قصد دارم به شما آموزش دهم.

برای این مثال ، من از Rails 7.2 ، SQLITE3 و BCRYPT استفاده خواهم کرد.

1. پیکربندی اولیه

برای ایجاد برنامه ریل ، اجرا کنید:

rails new verification-app
cd verification-app
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

1.1 یک مدل برای کاربر ایجاد کنید
در ترمینال خود اجرا کنید:

rails generate model User name:string email:string password_digest:string verification_code:string verified:boolean
rails db:migrate
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

تغییر app/models/user.rb شامل احراز هویت ایمن:

class User < ApplicationRecord
  has_secure_password
  before_create :generate_verification_code
  validates :name, :email, presence: true
  validates :email, uniqueness: true, format: { with: URI::MailTo::EMAIL_REGEXP }

  def generate_verification_code
    self.verification_code = rand(100000..999999).to_s
    self.verified = false
  end
end
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

روش generate_verification_code: این روش هر زمان که یک کاربر جدید ایجاد شود ، یک کد تأیید تصادفی (یک شماره 6 رقمی) ایجاد می کند. کد در verification_code ویژگی ، و verified ویژگی تنظیم شده است false، نشان می دهد که کاربر هنوز تأیید نشده است.

2. پیکربندی Mailer

Mailer ماژول Rails است که مسئول تسهیل ارسال ایمیل است. این امکان را به شما می دهد تا الگوها ، چیدمان ها و برخی منطق را برای ایمیل به روش سازمان یافته تعریف کنید.

2.1 ایجاد پست الکترونیکی
در ترمینال خود اجرا کنید:

rails generate mailer UserMailer
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

تغییر app/mailers/user_mailer.rb :

class UserMailer < ApplicationMailer
  default from: 'youremail@gmail.com'

  def verification_email(user)
    @user = user
    mail(to: @user.email, subject: "Verification Code")
  end
end
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

در 'youremail@gmail.com' ، از ایمیلی استفاده کنید که مسئولیت ارسال به کاربران را بر عهده دارد. توصیه می کنم از آن در یک متغیر اعتبار یا محیط استفاده کنید ، اما در این مثال ، آن را بسیار صریح می کنم.

ایجاد نمای app/views/user_mailer/verification_email.html.erb:




  


  

Hi, <%= @user.name %>!

Your verification code is: <%= @user.verification_code %>

Enter this code on the verification page to activate your account.

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

این دیدگاه طرح نامه ای است که کاربر دریافت می کند. همانطور که در مثال نشان داده شده است ، می توانید آن را با Tailwind سبک کنید. همچنین می توانید از آن در یک ساختار معمولی ERB استفاده کنید.

2.2 پیکربندی SMTP (Gmail – تست)
در برنامه من ، من برای ارسال ایمیل از Gmail استفاده کردم ، اما می توانید از خدمات دیگری مانند SendGrid (توصیه شده برای تولید) استفاده کنید. فقط مطابق دستورالعمل هر یک از آنها را پیکربندی کنید.

در مورد Gmail ، شما باید یک برنامه را در لینک زیر ثبت کنید و در صورت تمایل از رمز عبور خود در اعتبار ریل یا ENV خود استفاده کنید.

  1. دسترسی: https://myaccount.google.com/apppasswords
  2. برای برنامه خود رمزعبور ایجاد کنید و به جای رمز عبور واقعی خود از آن استفاده کنید.
  3. در “user_name” ، این ایمیل است که استفاده خواهد شد.
  4. در “گذرواژه” رمز عبور حاصل از ثبت نام برنامه Gmail را وارد می کنید.

اضافه کردن config/environments/development.rb:

config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
  address: "smtp.gmail.com",
  port: 587,
  domain: "gmail.com",
  authentication: "plain",
  enable_starttls_auto: true,
  user_name: Rails.application.credentials.gmail_username,
  password: Rails.application.credentials.gmail_password
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

3. اجرای کاربران کنترلر

در کنترلر ما ، اینجاست که روشهای مسئول رسیدگی به درخواست ها و اجرای منطق ارسال ایمیل در آن قرار دارند.
تغییر app/controllers/users_controller.rb:

class UsersController < ApplicationController
  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)
    if @user.save
      UserMailer.verification_email(@user).deliver_now
      redirect_to verify_user_path(@user), notice: "Code sent to your email."
    else
      render :new, status: :unprocessable_entity, notice: "Try again"
    end
  end

  def verify
    @user = User.find(params[:id])
  end

  def confirm_verification
    @user = User.find(params[:id])
    if @user.verification_code == params[:verification_code]
      @user.update(verified: true, verification_code: nil)
      redirect_to new_session_path, notice: "Account verified! Log in."
    else
      flash.now[:alert] = "Code invalid!"
      render :verify, status: :unprocessable_entity
    end
  end

  def resend_verification_code
    @user = User.find(params[:id])
    @user.update(verification_code: rand(100000..999999).to_s)
    UserMailer.verification_email(@user).deliver_now

    redirect_to verify_user_path(@user), notice: "New code sent to your email."
  end

  def show
    @user = User.find(params[:id])
  end

  private

  def user_params
    params.require(:user).permit(:name, :email, :password, :password_confirmation)
  end
end
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

4. نمای تأیید ایمیل را ایجاد کنید.

این نمای اصلی ما خواهد بود که می توانیم کدی را که در ایمیل دریافت می کنیم وارد کنیم.
ایجاد کردن app/views/users/verify.html.erb:

A verification code has been sent to your email.

<%= form_with url: confirm_verification_user_path(@user), local: true, class: "space-y-4" do |form| %>

<%= form.label :verification_code, "Enter the Code", class: "block text-sm font-medium text-gray-700" %> <%= form.text_field :verification_code, class: "mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" %>

<%= form.submit "Verify Account", class: "w-full flex justify-center py-2 px-4 border border-transparent rounded-md shadow-sm text-sm font-medium text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500" %>

<% end %>

You can resend the code at 30 seconds.

<%= button_to "Resend Code", resend_verification_code_user_path(@user), method: :post, id: "resend-button", disabled: true %>
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

5. پیکربندی مسیرها

سرانجام ، پیکربندی مسیرهای ما.

resources :users, only: [:new, :create, :show] do
  member do
    get :verify
    post :confirm_verification
    post :resend_verification_code
  end
end
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

پایان

و این همان است ، اکنون می توانید ایمیل واقعی ارسال کنید. اگر این فقط برای آزمایش محلی باشد ، Gmail خوب کار می کند. برای تولید ، SendGrid یا MailGun بیشتر توصیه می شود. ریل ها قادر به انجام کارهای بی شماری با امکانات بی شماری هستند و ارسال ایمیل یکی از آنها با سهولت نسبی است. امیدوارم این مقاله به کسانی که به آن احتیاج دارند کمک کند ، و اگر چیزی اشتباه پیدا کردید یا پیشنهادی برای بهبود دارید ، احساس راحتی کنید که آن را در نظرات بگذارید تا بتوانیم در مورد آن بحث کنیم.

مخزن در GitHub من: Rails-Evification-Email

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا