EduFlow
Git و GitHub
⁦0%⁩

الوحدة 3 · التعاون على GitHub

المصادقة بمفاتيح SSH أو HTTPS

14 دقراءة 4 درتّب الخطوات

الدرس في لمحة

أعِدّ مصادقة Git مع GitHub عبر HTTPS باستخدام مدير بيانات اعتماد أو عبر SSH بمفتاح ed25519، واختبر الاتصال، وبدّل عنوان الـ remote بين الصيغتين.

  1. 1البروتوكولان
  2. 2الخيار الأول: HTTPS مع مدير بيانات اعتماد
  3. 3الخيار الثاني: مفاتيح SSH
  4. 4توجيه الـ remote إلى البروتوكول الصحيح

لا فيديو هنا، بل الشيء الحقيقي: درس مكتوب وأمثلة قابلة للتشغيل واختبار وتدريب.

طلب منك أول git push اسم مستخدم وكلمة مرور. يحتاج GitHub إلى دليل على أن من يرفع إلى maya-okafor/portfolio هي Maya فعلًا. ولن يقبل كلمة مرور حسابك لهذا الغرض؛ فقد توقّف عن ذلك منذ 2021، حين نقل عمليات Git إلى بيانات اعتماد أقوى. لديك خياران جيدان، وتُعدّ أيًّا منهما مرة واحدة فقط لكل حاسوب.

البروتوكولان

عنوان الـ remote يحدّد كيف يتحدّث Git مع GitHub:

Text
https://github.com/maya-okafor/portfolio.git    HTTPS
git@github.com:maya-okafor/portfolio.git        SSH

HTTPS يصادق بـ token. ويحصل مدير بيانات الاعتماد على واحد بإرسالك عبر تسجيل الدخول العادي إلى GitHub في المتصفّح (بما في ذلك المصادقة الثنائية)، ثم يخزّنه في المخزن الآمن لنظامك. أما SSH فيصادق بزوج مفاتيح تولّده أنت؛ يخزّن GitHub النصف العام ويتحقّق من أنك تملك النصف الخاص.

أيهما تختار؟ HTTPS مع مدير بيانات اعتماد هو الأسهل إعدادًا ويعمل على أي شبكة تسمح بتصفّح الويب. أما SSH فيأخذ خمس دقائق إضافية، ولا تنتهي صلاحية مفتاحه (يحذف GitHub المفتاح فقط إن بقي عامًا كاملًا دون استخدام)، وهو ما يستخدمه كثير من المطوّرين يوميًا. وكلاهما آمن بالقدر نفسه حين يُعدّ كما يجب. إن كنت مترددًا فابدأ بـ HTTPS؛ وتستطيع التبديل في أي وقت.

الخيار الأول: HTTPS مع مدير بيانات اعتماد

يأتي Git Credential Manager (GCM) مع Git for Windows. وعلى macOS ثبّته بـ Homebrew (brew install --cask git-credential-manager)؛ وعلى Linux اتبع دليل التثبيت في صفحته على GitHub. في المرة التالية التي يحتاج فيها Git إلى بيانات اعتماد، تُفتح نافذة متصفّح، فتسجّل دخولك إلى GitHub وتوافق، ويخزّن GCM الـ token. ولن يُطلب منك ذلك مرة أخرى.

وإن كنت قد ثبّت GitHub CLI، فبإمكانه القيام بالمهمّة نفسها:

Terminal
gh auth login

اختر GitHub.com ثم HTTPS، وأجب بنعم عن “Authenticate Git with your GitHub credentials?”. يسجّل دخولك عبر المتصفّح ويضبط Git ليستخدمه كمساعد بيانات اعتماد (credential helper).

البديل اليدوي هو personal access token (رمز وصول شخصي): أنشئ واحدًا من Settings ثم Developer settings، والصقه حيث يطلب Git كلمة المرور. هذا ينجح، لكن عليك أن تدير انتهاء صلاحيته وتخزينه بنفسك، لذا فضّل مدير بيانات الاعتماد على جهازك الشخصي، واحتفظ بالـ tokens للأتمتة.

الخيار الثاني: مفاتيح SSH

ولّد زوج مفاتيح. Ed25519 هو الخيار الافتراضي الحديث:

Terminal
ssh-keygen -t ed25519 -C "maya.okafor@example.com"

اضغط Enter لقبول المكان الافتراضي، ثم اضبط عبارة مرور (passphrase). عبارة المرور تحمي المفتاح الخاص إن سُرق حاسوبك يومًا. والتعليق بعد -C اسم يساعدك على التعرّف على المفتاح لاحقًا.

لديك الآن ملفان:

  • ~/.ssh/id_ed25519، وهو المفتاح الخاص. لا يغادر هذا الجهاز أبدًا.
  • ~/.ssh/id_ed25519.pub، وهو المفتاح العام. آمن للمشاركة؛ وهو ما يحصل عليه GitHub.

حمّل المفتاح في الـ SSH agent لتكتب عبارة المرور مرة واحدة في كل جلسة، لا مع كل رفع:

Terminal
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519

على macOS، الأمر ssh-add --apple-use-keychain ~/.ssh/id_ed25519 يخزّن عبارة المرور في Keychain؛ ويعرض دليل GitHub أسطر ~/.ssh/config المقابلة. ثم انسخ المفتاح العام (pbcopy < ~/.ssh/id_ed25519.pub على macOS، أو افتح الملف وانسخ سطره الوحيد)، وعلى GitHub اذهب إلى Settings ثم SSH and GPG keys ثم New SSH key، والصقه.

اختبر الاتصال:

Terminal
ssh -T git@github.com

في المرة الأولى، يطلب منك SSH تأكيد البصمة (fingerprint) الخاصة بخادم GitHub؛ قارنها بالبصمات التي ينشرها GitHub في وثائقه قبل أن تكتب yes. والنجاح يبدو هكذا:

Text
Hi maya-okafor! You've successfully authenticated, but GitHub does not provide shell access.

سطر “does not provide shell access” طبيعي؛ فأنت لا تسجّل الدخول إلى خادم، بل تثبت هويتك فقط.

توجيه الـ remote إلى البروتوكول الصحيح

المصادقة تتبع العنوان. إن أعددت SSH لكنك استنسخت عبر HTTPS، يواصل Git استخدام HTTPS. تحقّق وبدّل:

Terminal
git remote -v
git remote set-url origin git@github.com:maya-okafor/portfolio.git
git push

والاتجاه المعاكس هو الأمر نفسه مع عنوان https://.

بعد حلّ مسألة الرفع، تستطيع أن تبدأ العمل كما تعمل الفرق على GitHub: عبر الـ pull requests.

أهم النقاط

  • لا يقبل GitHub كلمة مرور حسابك في عمليات Git؛ استخدم مدير بيانات اعتماد، أو personal access token، أو مفتاح SSH.
  • يسجّل Git Credential Manager (أو gh auth login) دخولك عبر المتصفّح مرة واحدة ويخزّن بيانات الاعتماد بأمان.
  • زوج مفاتيح SSH له نصف خاص لا يغادر جهازك أبدًا، ونصف عام بامتداد .pub تضيفه إلى GitHub.
  • ssh -T git@github.com يختبر مصادقة SSH ويرحّب بك باسم المستخدم حين تنجح.
  • عنوان الـ remote يحدّد البروتوكول: https://github.com/… يستخدم HTTPS، و git@github.com:… يستخدم SSH؛ وتبدّل بينهما بـ git remote set-url.

قراءات إضافية

تحقّق من فهمك

4 أسئلة

السؤال 1 من 4

يطلب git push عبر HTTPS كلمة مرور. تكتب كلمة مرور GitHub فتحصل على Support for password authentication was removed. ماذا تفعل؟

السؤال 2 من 4

بعد تشغيل ssh-keygen -t ed25519، أيّ ملف تلصقه في نموذج “New SSH key” على GitHub؟

السؤال 3 من 4

الـ SSH يعمل (ssh -T git@github.com يرحّب بك)، لكن git push ما زال يطلب اسم مستخدم وكلمة مرور. لماذا؟

السؤال 4 من 4

أنت على شبكة تحجب المنفذ 22. أيّ خيار يُبقي Git يعمل بأقل عناء؟

تدريب

رتّب الخطوات

أعِدّ SSH للموقع الشخصي

قرّرت أن ترفع الموقع الشخصي عبر SSH. رتّب خطوات الإعداد بالترتيب الذي ينجح، من عدم وجود أي مفتاح إلى git push ناجح عبر SSH. أنهِ كل العمل المحلي على المفتاح (توليده وتحميله في الـ agent) قبل أن تلمس GitHub، وتأكّد أن SSH يعمل قبل أن تغيّر إعدادات الـ repository.

استخدم أزرار الأسهم لإعادة الترتيب.

  1. 1شغّل git remote set-url origin git@github.com:maya-okafor/portfolio.git، ثم git push.
  2. 2شغّل الـ agent ثم ssh-add ~/.ssh/id_ed25519.
  3. 3شغّل ssh -T git@github.com وتأكّد أنه يرحّب بك باسم المستخدم.
  4. 4على GitHub، افتح Settings ثم SSH and GPG keys ثم New SSH key، والصقه.
  5. 5انسخ محتوى ~/.ssh/id_ed25519.pub.
  6. 6شغّل ssh-keygen -t ed25519 -C "maya.okafor@example.com" واضبط عبارة مرور.