ادغام Google OAuth2 با برنامه Devise for a Ruby on Rails
به عنوان یک توسعهدهنده Ruby on Rails، اغلب زمانی فرا میرسد که از شما خواسته میشود مکانیسمهای احراز هویت را در برنامه خود پیادهسازی کنید. Devise یکی از محبوب ترین راه حل های احراز هویت در اکوسیستم Rails است. هنگامی که با Google OAuth2 ترکیب می شود، تجربه ورود بدون زحمتی را برای کاربران فراهم می کند. در این مقاله، میخواهم راهنمای گام به گام نحوه راهاندازی Google OAuth2 با برنامه Devise on Rails را به شما معرفی کنم، همچنین با استفاده از کنترل استثناها، برنامه شما را قوی و قابل اعتماد میکند.
مرحله 1: راه اندازی Google API
سفر ما با ایجاد یک پروژه جدید در Google API Console آغاز می شود. پس از ایجاد پروژه، باید Google+ API (بخشی ضروری از فرآیند احراز هویت Google OAuth2) را فعال کنیم. این را ارسال کنید؛ می توانید شناسه مشتری OAuth را برای برنامه وب خود ایجاد کنید. به یاد داشته باشید URL بازگشت به تماس خود را به عنوان یک URI تغییر مسیر مجاز اضافه کنید. برای توسعه، این معمولا شکل می گیرد http://localhost:3000/users/auth/google_oauth2/callback
. Google یک Client ID و Client Secret ارائه می دهد که بعداً در پیکربندی برنامه Rails از آنها استفاده خواهیم کرد.
مرحله 2: پیکربندی برنامه Rails
گام بعدی این است که برنامه Rails خود را با سیستم Google OAuth تطبیق دهید. با اضافه کردن شروع کنید omniauth-google-oauth2
و dotenv-rails
جواهرات به Gemfile شما. دومی به مدیریت موثر متغیرهای محیطی شما کمک می کند.
gem 'devise'
gem 'omniauth-google-oauth2'
gem 'dotenv-rails', groups: [:development, :test]
بعد از دویدن bundle install
برای نصب این جم ها، a ایجاد کنید .env
در ریشه برنامه Rails خود فایل کنید. اینجا جایی است که شناسه مشتری Google و Client Secret را که قبلاً به دست آورده بودیم ذخیره می کنیم.
GOOGLE_CLIENT_ID=your_client_id
GOOGLE_CLIENT_SECRET=your_client_secret
این متغیرهای محیطی برای برنامه Rails شما برای برقراری ارتباط با سرور Google OAuth2 ضروری هستند. برای ادغام آنها، کد زیر را وارد کنید
config/initializers/devise.rb
:
config.omniauth :google_oauth2, ENV['GOOGLE_CLIENT_ID'], ENV['GOOGLE_CLIENT_SECRET'], {}
در مرحله بعد، ما باید مطمئن شویم که مدل کاربر ما همهجانبه است و میتواند دادههای برگشت تماس را مدیریت کند. برای رسیدن به این هدف، به روز رسانی کنید app/models/user.rb
:
class User < ApplicationRecord
devise :database_authenticatable, :registerable, :omniauthable, omniauth_providers: %i[google_oauth2]
def self.from_omniauth(access_token)
data = access_token.info
user = User.where(email: data['email']).first
# Uncomment the section below if you want users to be created if they don't exist
unless user
user = User.create(
email: data['email'],
password: Devise.friendly_token[0,20]
)
end
user
end
end
علاوه بر این، ما باید callback in را مشخص کنیم config/routes.rb
:
devise_for :users, controllers: { omniauth_callbacks: 'users/omniauth_callbacks' }
در نهایت، بیایید ایجاد کنیم OmniauthCallbacksController
که در app/controllers/users/omniauth_callbacks_controller.rb
، که داده های احراز هویت بازگردانده شده توسط سرور Google OAuth2 را مدیریت می کند:
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
def google_oauth2
@user = User.from_omniauth(request.env['omniauth.auth'])
if @user.persisted?
sign_in_and_redirect @user
else
session['devise.google_data'] = request.env['omniauth.auth'].except(:extra) # Removing extra as it can overflow some session stores
redirect_to new_user_registration_url, alert: @user.errors.full_messages.join("\n")
end
end
end
مرحله 3: رسیدگی به استثنا
آخرین اما نه کم اهمیت، ما نباید اهمیت رسیدگی به استثنا را نادیده بگیریم. برنامههای کاربردی قوی باید به خوبی با شکستها برخورد کنند. برای این منظور، یک کنترل کننده استثنای OmniAuth را راه اندازی می کنیم.
که در config/initializers/omniauth.rb
:
OmniAuth.config.on_failure = proc do |env|
"Users::OmniauthCallbacksController".constantize.action(:failure).call(env)
end
و سپس روش شکست را به آن اضافه کنید OmniauthCallbacksController
:
def failure
flash[:error] = 'There was an error while trying to authenticate you...'
redirect_to new_user_session_path
end
به یاد داشته باشید که سرور Rails خود را هر زمان که تغییراتی در مقداردهی اولیه ایجاد می کنید، مجددا راه اندازی کنید.
و voila! شما بهتازگی برنامه Rails خود را با Google OAuth2 با استفاده از Devise راهاندازی کردهاید، و به کاربران خود راهی آسان و امن برای ورود به حسابهای Google خود ارائه میدهید. کد نویسی مبارک!