OAuth 2.0 وتفويض JWT بلغة Go: دليل كامل للمبتدئين

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا نحتاج OAuth 2.0 و JWT في Go؟



تطوير الويب الحديث لا يمكن تصوره بدون مصادقة وتفويض آمنين. إذا كنت تكتب أول API أو خدمة مصغرة أو تطبيق ويب بلغة Go (Golang)، فستواجه عاجلاً أم آجلاً الحاجة إلى حماية بيانات المستخدمين. أصبح المعياران — OAuth 2.0 و JWT (JSON Web Token) — المعيار الذهبي في هذا المجال.



في هذه المقالة، سنشرح كيفية عمل OAuth 2.0 و JWT، ونكتب تطبيقاً بسيطاً لكنه عملي بلغة Go. ستتعلم كيفية إصدار رموز الوصول، والتحقق منها، وحماية نقاط النهاية الخاصة بك. المقالة موجهة للمطورين المبتدئين الذين لديهم معرفة أساسية بلغة Go و HTTP.



ما هو OAuth 2.0 و JWT؟ بكلمات بسيطة



OAuth 2.0 — بروتوكول الوصول المفوض



OAuth 2.0 ليس مكتبة ولا دالة، بل هو بروتوكول. تخيل أنك تريد تسجيل الدخول إلى موقع عبر Google. يسمح OAuth 2.0 للموقع بالحصول من Google على وصول محدود إلى بياناتك (مثل البريد الإلكتروني) دون أن تنقل إليه كلمة مرور Google الخاصة بك. وهذا ما يسمى "الوصول المفوض".



الأدوار الرئيسية في OAuth 2.0:

  • مالك المورد (Resource Owner) — المستخدم (أنت).
  • العميل (Client) — التطبيق الذي يريد الوصول (موقعنا).
  • خادم التفويض (Authorization Server) — الخادم الذي يصدر الرموز (Google).
  • خادم المورد (Resource Server) — الخادم الذي يحتوي على بيانات المستخدم (API Google).


JWT — تنسيق الرمز



JWT (JSON Web Token) هي طريقة مضغوطة ومكتفية ذاتياً لنقل المعلومات بين الأطراف على شكل كائن JSON. يتكون من ثلاثة أجزاء مفصولة بنقاط:



  • الرأس (Header) — نوع الرمز وخوارزمية التوقيع (مثل HS256).
  • الحمولة (Payload) — البيانات (المطالبات): معرف المستخدم، الدور، تاريخ انتهاء الصلاحية.
  • التوقيع (Signature) — توقيع يضمن عدم تغيير الرمز.


غالباً ما يُستخدم JWT كـ رمز وصول (Access Token) في OAuth 2.0. يقوم الخادم بتوقيع الرمز بمفتاح سري، ويرسله العميل في الترويسة Authorization: Bearer <token>.



التطبيق العملي: تنفيذ تفويض JWT بلغة Go



سنكتب خادم HTTP صغير بلغة Go يصدر رموز JWT ويتحقق منها على المسارات المحمية. للعمل مع JWT، سنستخدم المكتبة الشهيرة github.com/golang-jwt/jwt/v5.



الخطوة 1: تثبيت التبعيات وهيكل المشروع



أنشئ وحدة جديدة وقم بتثبيت المكتبة:



go mod init auth-examplego get github.com/golang-jwt/jwt/v5go get golang.org/x/crypto


سيكون هيكل الملفات بسيطاً:



  • main.go — نقطة الدخول والمسارات.
  • auth.go — منطق إنشاء والتحقق من JWT.
  • handlers.go — معالجات HTTP.


الخطوة 2: إنشاء رمز JWT



لننشئ ملف auth.go. هنا سنحدد المفتاح السري (في مشروع حقيقي، احفظه في ملف .env) ودالة لتوليد الرمز.



package main

import ( "time" "github.com/golang-jwt/jwt/v5")

var jwtSecret = []byte("your-secret-key-here")

type Claims struct { UserID int `json:"user_id"` Username string `json:"username"` jwt.RegisteredClaims}

func GenerateToken(userID int, username string) (string, error) { claims := Claims{ UserID: userID, Username: username, RegisteredClaims: jwt.RegisteredClaims{ ExpiresAt: jwt.NewNumericDate(time.Now().Add(24 * time.Hour)), IssuedAt: jwt.NewNumericDate(time.Now()), Issuer: "auth-example", }, }

token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) return token.SignedString(jwtSecret)}
\

المدونات

توصيات الكتب