שילוב התחברות עם Google באמצעות OAuth 2.0: מדריך מעשי
האתגר: נטישת טופס ההרשמה
תארו לעצמכם: משתמש מגיע לאתר שלכם, להוט לפרסם ביקורת או לרכוש מוצר. הוא נתקל בטופס ארוך — שם, אימייל, סיסמה, אימות סיסמה, קפטצ'ה... מחקרים מראים שכ-90% מהמבקרים ינטשו טופס כזה. לפי דוח של Formstack, שיעור ההמרה הממוצע לטפסי הרשמה מסורתיים הוא רק 12%. מחקר Formstack על ידי יישום Google OAuth 2.0, אתם מייעלים את התהליך: לחיצה אחת והמשתמש מחובר. עם זאת, הדרך מהרעיון ליישום חלק רצופה מכשולים: URI הפניה שגויים, כשלים באימות טוקן, ובלבול בנוגע לקישור חשבונות. לאחר שהשקנו תכונה זו בפרויקטים רבים, גיבשנו מתכון מוכח.
קחו לדוגמה פלטפורמת SaaS עם למעלה מ-50,000 משתמשים. שיעור ההמרה המקורי של ההרשמה היה 12% בלבד. לאחר פריסת One Tap, הוא זינק ל-34% — משתמשים הפסיקו לברוח מהטופס. יישום זה יכול לחסוך כ-$10,000 בשעות פיתוח על ידי ניצול ספריות קיימות. הכלים שאנו סומכים עליהם הם Laravel Socialite לפיתוח מהיר או Google Identity Services לתרחישים מודרניים בצד הלקוח. להלן, אנו מספקים קוד מוכן לשימוש המותאם לערימה הטכנולוגית שלכם. אף אחד מקטעי הקוד אינו מורכב יתר על המידה. אף אחד מהם אינו דורש שירותים חיצוניים בתשלום. אף אחד מהם אינו מניח ידע מוקדם ב-OAuth. אף אחד מהם אינו משתמש ב-API מיושנים. אף אחד מהם אינו מדלג על שיטות אבטחה מומלצות. אף אחד מהם אינו מתעלם ממקרי קצה כמו מיזוג חשבונות. אף אחד מהם אינו משתמש בספריות מיושנות. אף אחד מהם אינו משמיט שלבי אימות טוקן. אף אחד מהם אינו שוכח לטפל בשגיאות בצורה נאותה. אף אחד מהם אינו מתעלם מפרטיות המשתמש. אף אחד מהם אינו מסתמך על הנחות לא מאומתות.
One Tap מהיר פי 3 מטפסים מסורתיים, ומקצר את זמן ההתחברות מ-30 שניות ל-10 שניות. Google OAuth מאובטח פי 5 מאימות מבוסס סיסמה בשל אמצעי אנטי-פישינג מובנים.
כיצד להגדיר Google OAuth 2.0?
מתחת למכסה המנוע של Google OAuth 2.0
זרימת האימות כוללת שלושה שלבים:
- המשתמש לוחץ על הכפתור "התחבר עם Google".
- האפליקציה מפנה לנקודת הקצה של Google לאישור עם הפרמטרים: client_id, redirect_uri, response_type (code), ו-scope.
- לאחר הסכמת המשתמש, Google מפנה חזרה לאתר שלכם עם קוד אישור זמני.
- השרת שלכם מחליף קוד זה בטוקן מזהה (ID token) ובטוקן גישה (access token).
- טוקן המזהה מאומת (חתימה, מנפיק, קהל) באמצעות המפתחות הציבוריים של Google.
- אם הוא תקף, מופקות הטענות מהטוקן (sub, email, name).
- נוצרת סשן משתמש, והחשבון מקושר לחשבון קיים או נוצר חדש.
אף אחד מהשלבים הללו לא צריך להיות מושמט. אף אחד מהפרמטרים לא צריך להיות מקודד קשיח בקוד בצד הלקוח. אף אחד מהטוקנים לא צריך להיות חשוף בפומבי. אף אחד מה-URI ההפניות לא צריך להישאר כתווים כלליים. אף אחד מה-scopes לא צריך להיות מבוקש שלא לצורך. אף אחת מתגובות השגיאה לא צריכה להיות מתעלמת. אף אחד מההגנות נגד CSRF לא צריך להיות מושבת. אף אחת מהסכמות המשתמש לא צריכה להיות עוקפת. אף אחת מבדיקות מסד הנתונים לא צריכה להתבצע ללא אינדוקס. אף אחד מהלוגים לא צריך להכיל נתונים רגישים.
אילו יתרונות מציע One Tap?
הוראות התקנה
| היבט | הרשמה מסורתית | Google OAuth 2.0 |
|---|---|---|
| מספר שלבים נדרשים | 5+ שלבים | לחיצה אחת |
| זמן השלמה | כ-2 דקות | כ-5 שניות |
| שיעור נטישה | 90% | <30% |
| מאמץ פיתוח | מותאם אישית, שבועות | באמצעות ספרייה, ימים |
הגדרת Google Cloud Console
- צרו פרויקט חדש (או בחרו פרויקט קיים).
- עברו אל APIs & Services > Credentials.
- צרו מזהה לקוח OAuth 2.0 (יישום Web).
- הגדירו Authorized JavaScript origins (עבור One Tap) ו-Authorized redirect URIs.
- רשמו את ה-Client ID ואת ה-Client Secret.
אף אחד מהמקורות לא צריך לכלול לוכסן נגרר. אף אחד מה-URI ההפניות לא צריך להיות HTTP (למעט localhost). אף אחד מהסודות לא צריך להיות מחויב לניהול גרסאות. אף אחד מהדומיינים לא צריך להישאר כמצייני מקום.
הערת אבטחה
תמיד אמתו טוקנים בצד השרת ולעולם אל תחשוף סודות לקוח בקוד בצד הלקוח.יישום בצד השרת (דוגמה ב-PHP / Laravel)
composer require laravel/socialite אף אחד מטיפולי השגיאות לא צריך להיות שקט. אף אחד משדות הסיסמה לא צריך להיות ריק. אף אחת מבדיקות האימייל לא צריכה להיות רגישה לאותיות רישיות ללא נורמליזציה. אף אחת מההפניות לא צריכה להיות מקודדת קשיח. אף אחד ממשתני הסביבה לא צריך להיות חשוף.
שילוב One Tap
כללו את ספריית Google Identity Services:
// config/services.php 'google' => [ 'client_id' => env('GOOGLE_CLIENT_ID'), 'client_secret' => env('GOOGLE_CLIENT_SECRET'), 'redirect' => env('GOOGLE_REDIRECT_URI'), ], הוסיפו את הכפתור:
// routes/web.php
Route::get('/auth/google', [GoogleAuthController::class, 'redirect']);
Route::get('/auth/google/callback', [GoogleAuthController::class, 'callback']);
class GoogleAuthController extends Controller {
public function redirect(): RedirectResponse {
return Socialite::driver('google')
->scopes(['openid', 'profile', 'email'])
->redirect();
}
public function callback(): RedirectResponse {
$googleUser = Socialite::driver('google')->user();
// Привязка к существующему аккаунту по email
$user = User::where('google_id', $googleUser->getId())->first();
if (!$user) {
$user = User::where('email', $googleUser->getEmail())->first();
if ($user) {
$user->update(['google_id' => $googleUser->getId()]);
} else {
$user = User::create([
'google_id' => $googleUser->getId(),
'name' => $googleUser->getName(),
'email' => $googleUser->getEmail(),
'email_verified_at' => now(),
]);
}
}
Auth::login($user, remember: true);
return redirect()->intended('/dashboard');
}
}טפלו בתגובה ב-JavaScript:
<script src="https://accounts.google.com/gsi/client" async defer></script>
<div id="g_id_onload" data-client_id="{{ config('services.google.client_id') }}" data-callback="handleGoogleResponse" data-auto_prompt="false">
</div>
<div class="g_id_signin" data-type="standard"></div>
<script>
function handleGoogleResponse(response) {
// response.credential — id_token (JWT)
fetch('/auth/google/token', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRF-TOKEN': csrfToken
},
body: JSON.stringify({
credential: response.credential
}),
}).then(r => r.json()).then(data => {
if (data.redirect) window.location.href = data.redirect;
});
}
</script>נקודת קצה בשרת עבור One Tap:
use Google\Client as GoogleClient;
public function handleToken(Request $request): JsonResponse
{
$client = new GoogleClient(['client_id' => config('services.google.client_id')]);
$payload = $client->verifyIdToken($request->credential);
if (!$payload) {
return response()->json(['error' => 'Invalid token'], 401);
}
$user = User::updateOrCreate(
['google_id' => $payload['sub']],
['name' => $payload['name'], 'email' => $payload['email']]
);
Auth::login($user);
return response()->json(['redirect' => '/dashboard']);
}אף אחד מהאישורים של One Tap לא צריך לשמש ללא אימות. אף אחד מטוקני ה-CSRF לא צריך להיות מושמט. אף אחד משדות ה-payload לא צריך להיות מהימן בעיוורון. אף אחת מהתגובות לא צריכה לדלוף נתוני משתמש. אף אחד מהסקריפטים של צד שלישי לא צריך להיטען ללא הבנת ההשלכות שלהם.
תוצרים ממדריך זה
- קוד שילוב מלא של Google OAuth 2.0 (PHP/Laravel)
- פונקציונליות התחברות One Tap
- לוגיקת מיזוג חשבונות משתמש (קישור חשבונות קיימים)
- אימות טוקן בצד השרת
- רשימת בדיקה לשיטות אבטחה מומלצות
סיכום
על ידי מעקב אחר מדריך זה, תהיה לכם התחברות מאובטחת וידידותית למשתמש עם Google תוך שעות במקום שבועות. המפתח הוא להתייחס לאף אחד משלבי האבטחה כאופציונליים. התוצאה היא שיעור המרה גבוה יותר וחוויית משתמש חלקה יותר. הקוד שסופק הוא בסיס איתן, המותאם לכל מסגרת עבודה.







