إضافة حزمة تطوير البرامج (SDK) لمشرف Firebase إلى خادمك

‫Admin SDK هي مجموعة من مكتبات الخوادم التي تتيح لك التفاعل مع Firebase من بيئات مميّزة لتنفيذ إجراءات مثل:

  • يمكنك إجراء طلبات بحث وتعديلات على خدمة Firebase SQL Connect لإدارة البيانات المجمّعة والعمليات الأخرى باستخدام امتيازات المشرف الكاملة.
  • قراءة بيانات Realtime Database وكتابتها باستخدام امتيازات المشرف الكاملة
  • يمكنك إرسال رسائل Firebase Cloud Messaging آليًا باستخدام نهج بسيط وبديل لبروتوكولات خادم Firebase Cloud Messaging.
  • إنشاء رموز مصادقة Firebase والتحقّق منها
  • يمكنك الوصول إلى موارد Google Cloud مثل حِزم Cloud Storage وقواعد بيانات Cloud Firestore المرتبطة بمشاريع Firebase.
  • يمكنك إنشاء وحدة تحكّم مشرف مبسّطة لتنفيذ إجراءات مثل البحث عن بيانات المستخدمين أو تغيير عنوان البريد الإلكتروني لمستخدم من أجل المصادقة.

إذا كنت مهتمًا باستخدام حزمة تطوير البرامج (SDK) لـ Node.js كعميل لوصول المستخدم النهائي (على سبيل المثال، في تطبيق Node.js لسطح المكتب أو تطبيق إنترنت الأشياء)، بدلاً من وصول المشرف من بيئة مميزة (مثل الخادم)، يجب عليك بدلاً من ذلك اتباع تعليمات إعداد حزمة تطوير البرامج (SDK) لعميل JavaScript.

في ما يلي مصفوفة ميزات تعرض ميزات Firebase المتوافقة مع كل لغة:

الميزة Node.js Java Python متابعة #C Dart
إنشاء رموز مميّزة مخصّصة
التحقّق من رمز التعريف المميّز
إدارة المستخدمين
التحكّم في الوصول باستخدام المطالبات المخصّصة
إبطال الرمز المميّز لإعادة التحميل
استيراد المستخدمين
إدارة ملفات تعريف الارتباط للجلسة
إنشاء روابط لاتّخاذ إجراءات في الرسائل الإلكترونية
إدارة إعدادات موفّر SAML/OIDC
دعم الاستخدام المتعدد
Firebase SQL Connect
Realtime Database *
Firebase Cloud Messaging
FCM البث المتعدّد الوجهات
إدارة الاشتراكات في مواضيع "FCM"
Cloud Storage
Cloud Firestore
إضافة الدوال إلى قائمة الانتظار باستخدام Cloud Tasks
إدارة المشاريع
قواعد الأمان
إدارة نماذج تعلُّم الآلة
Firebase Remote Config
Firebase App Check
Firebase Extensions
Firebase Phone Number Verification

لمزيد من المعلومات حول دمج Admin SDK لهذه الاستخدامات، يُرجى الاطّلاع على المستندات ذات الصلة: Realtime Database وFCM وAuthentication وRemote Config وCloud Storage. يركّز الجزء المتبقي من هذه الصفحة على الإعداد الأساسي لـ Admin SDK.

المتطلبات الأساسية

  • تأكَّد من أنّ لديك تطبيق خادم.

  • تأكَّد من أنّ الخادم يشغّل ما يلي استنادًا إلى Admin SDK الذي تستخدمه:

    • ‫Admin Node.js SDK — الإصدار 22 من Node.js أو الإصدارات الأحدث
    • ‫Admin Java SDK — الإصدار 8 من Java أو الإصدارات الأحدث
    • حزمة SDK الخاصة بالمشرف في Python: الإصدار 3.9 من Python أو إصدار أحدث (ننصح باستخدام الإصدار 3.10 من Python أو إصدار أحدث)
      تم إيقاف الإصدار 3.9 من Python نهائيًا.
    • ‫Admin Go SDK — الإصدار 1.25 من Go أو الإصدارات الأحدث
    • حزمة تطوير البرامج (SDK) الخاصة بـ Admin .NET: الإصدار 4.6.2 أو إصدار أحدث من ‎.NET Framework أو الإصدار 2 .0 من ‎.NET Standard أو الإصدار 6 .0 أو إصدار أحدث من ‎.NET (يُنصح باستخدام الإصدار 8 .0 أو إصدار أحدث من ‎.NET)
      تم إيقاف دعم الإصدارَين 6.0 و7.0 من ‎.NET نهائيًا.
    • حزمة SDK التجريبية لمشرف Dart: تأكَّد من أنّ الخادم يشغّل الإصدار 3.9 من حزمة SDK لمشرف Dart أو إصدارًا أحدث.

إعداد مشروع Firebase وحساب خدمة

لاستخدام Firebase Admin SDK، ستحتاج إلى ما يلي:

  • مشروع Firebase
  • حساب خدمة SDK للمشرف في Firebase للتواصل مع Firebase يتم إنشاء حساب الخدمة هذا تلقائيًا عند إنشاء مشروع على Firebase أو إضافة Firebase إلى مشروع على Google Cloud.
  • ملف إعداد يحتوي على بيانات اعتماد حساب الخدمة

إذا لم يكن لديك مشروع على Firebase، عليك إنشاء مشروع في وحدة تحكّم Firebase. انتقِل إلى مقالة فهم مشاريع Firebase لمزيد من المعلومات عن مشاريع Firebase.

إضافة حزمة SDK

إذا كنت بصدد إعداد مشروع جديد، عليك تثبيت حزمة تطوير البرامج (SDK) للغة التي تختارها.

Node.js

تتوفّر حزمة تطوير البرامج (SDK) لإدارة Firebase على Node.js في npm. إذا لم يكن لديك ملف package.json، يمكنك إنشاء ملف من خلال npm init. بعد ذلك، ثبِّت حزمة npm التالية: firebase-admin واحفظها في package.json:

npm install firebase-admin --save

لاستخدام الوحدة في تطبيقك، يمكنك require من أي ملف JavaScript:

const { initializeApp } = require('firebase-admin/app');

إذا كنت تستخدم ES2015، يمكنك import الوحدة:

import { initializeApp } from 'firebase-admin/app';

Java

يتم نشر حزمة تطوير البرامج (SDK) لمشرف Firebase في Java في مستودع Maven المركزي. لتثبيت المكتبة، حدِّدها كاعتمادية في ملف build.gradle:

dependencies {
  implementation 'com.google.firebase:firebase-admin:9.11.0'
}

إذا كنت تستخدم Maven لإنشاء تطبيقك، يمكنك إضافة التبعية التالية إلى pom.xml:

<dependency>
  <groupId>com.google.firebase</groupId>
  <artifactId>firebase-admin</artifactId>
  <version>9.11.0</version>
</dependency>

Python

تتوفّر حزمة تطوير البرامج (SDK) لمشرف Firebase في Python من خلال pip. يمكنك تثبيت المكتبة لجميع المستخدمين من خلال sudo:

sudo pip install firebase-admin

أو يمكنك تثبيت المكتبة للمستخدم الحالي فقط من خلال تمرير العلامة --user:

pip install --user firebase-admin

متابعة

يمكن تثبيت حزمة Go Admin SDK باستخدام الأداة المساعدة go get:

# Install the latest version:
go get firebase.google.com/go/v4@latest

# Or install a specific version:
go get firebase.google.com/go/v4@4.22.0

#C

يمكن تثبيت حزمة ‎ .NET Admin SDK باستخدام أداة إدارة حِزم ‎ .NET:

Install-Package FirebaseAdmin -Version 3.7.0

بدلاً من ذلك، يمكنك تثبيته باستخدام أداة سطر الأوامر dotnet:

dotnet add package FirebaseAdmin --version 3.7.0

أو يمكنك تثبيتها من خلال إضافة إدخال مرجع الحزمة التالي إلى ملف .csproj:

<ItemGroup>
  <PackageReference Include="FirebaseAdmin" Version="3.7.0" />
</ItemGroup>

‫Dart (تجريبية)

dart pub add firebase_admin_sdk

لاستخدام الوحدة في تطبيقك، استورِدها كما هو موضّح:

import 'package:firebase_admin_sdk';

// Also import the separate Firestore package if you're interacting with Firestore.
import 'package:google_cloud_firestore/google_cloud_firestore.dart';

إعداد حزمة تطوير البرامج (SDK)

بعد إنشاء مشروع Firebase، يمكنك إعداد حزمة تطوير البرامج (SDK) باستخدام بيانات الاعتماد التلقائية لتطبيق Google. بما أنّ عملية البحث عن بيانات الاعتماد التلقائية تتم بشكل آلي بالكامل في بيئات Google، بدون الحاجة إلى توفير متغيّرات بيئية أو إعدادات أخرى، ننصح بشدة باستخدام هذه الطريقة لإعداد حزمة تطوير البرامج (SDK) للتطبيقات التي تعمل في بيئات Google، مثل Firebase App Hosting وCloud Run وApp Engine وCloud Functions for Firebase.

لتحديد خيارات الإعداد للخدمات مثل Realtime Database أو Cloud Storage أو Cloud Functions، استخدِم متغيّر البيئة FIREBASE_CONFIG. إذا كان محتوى المتغيّر FIREBASE_CONFIG يبدأ بـ {، سيتم تحليله كعنصر JSON. بخلاف ذلك، تفترض حزمة تطوير البرامج (SDK) أنّ السلسلة هي مسار ملف JSON يحتوي على الخيارات.

Node.js

const app = initializeApp();

Java

FirebaseApp.initializeApp();

Python

default_app = firebase_admin.initialize_app()

متابعة

app, err := firebase.NewApp(context.Background(), nil)
if err != nil {
	log.Fatalf("error initializing app: %v\n", err)
}

#C

FirebaseApp.Create();

‫Dart (تجريبية)

final admin = FirebaseApp.initializeApp();

بعد إعدادها، يمكنك استخدام Admin SDK لإنجاز الأنواع التالية من المهام:

استخدام رمز مميّز لإعادة التحميل في OAuth 2.0

توفّر Admin SDK أيضًا بيانات اعتماد تتيح لك المصادقة باستخدام رمز مميّز لإعادة التحميل من Google OAuth2:

Node.js

const myRefreshToken = '...'; // Get refresh token from OAuth2 flow

initializeApp({
  credential: refreshToken(myRefreshToken),
  databaseURL: 'https://<DATABASE_NAME>.firebaseio.com'
});

Java

FileInputStream refreshToken = new FileInputStream("path/to/refreshToken.json");

FirebaseOptions options = FirebaseOptions.builder()
    .setCredentials(GoogleCredentials.fromStream(refreshToken))
    .setDatabaseUrl("https://<DATABASE_NAME>.firebaseio.com/")
    .build();

FirebaseApp.initializeApp(options);

Python

cred = credentials.RefreshToken('path/to/refreshToken.json')
default_app = firebase_admin.initialize_app(cred)

متابعة

opt := option.WithCredentialsFile("path/to/refreshToken.json")
config := &firebase.Config{ProjectID: "my-project-id"}
app, err := firebase.NewApp(context.Background(), config, opt)
if err != nil {
	log.Fatalf("error initializing app: %v\n", err)
}

#C

FirebaseApp.Create(new AppOptions()
{
    Credential = CredentialFactory.FromFile<UserCredential>("path/to/refreshToken.json").ToGoogleCredential(),
});

إعداد حزمة تطوير البرامج (SDK) في بيئات غير تابعة لـ Google

إذا كنت تعمل في بيئة خادم غير تابعة لـ Google ولا يمكن فيها إجراء عملية البحث عن بيانات الاعتماد التلقائية بشكل آلي بالكامل، يمكنك إعداد حزمة تطوير البرامج (SDK) باستخدام ملف مفتاح حساب خدمة تم تصديره.

تتيح مشاريع Firebase استخدام حسابات خدمة Google، والتي يمكنك استخدامها لاستدعاء واجهات برمجة تطبيقات خادم Firebase من خادم التطبيق أو البيئة الموثوقة. إذا كنت تطوّر رمزًا برمجيًا محليًا أو تنشر تطبيقك في المؤسسة، يمكنك استخدام بيانات الاعتماد التي تم الحصول عليها باستخدام حساب الخدمة هذا لمنح الإذن لطلبات الخادم.

يمكنك الاطّلاع على جميع حسابات الخدمة لمشروعك على Firebase في علامة التبويب الإعدادات > حسابات الخدمة.

لمصادقة حساب خدمة وتفويضه للوصول إلى خدمات Firebase، يجب إنشاء ملف مفتاح خاص بتنسيق JSON.

لإنشاء ملف مفتاح خاص لحساب الخدمة:

  1. في وحدة تحكّم Firebase، انتقِل إلى الإعدادات > علامة التبويب حسابات الخدمة.

  2. انقر على إنشاء مفتاح خاص جديد، ثم أكِّد ذلك بالنقر على إنشاء مفتاح.

  3. خزِّن ملف JSON الذي يحتوي على المفتاح بشكل آمن.

عند التفويض من خلال حساب خدمة، يتوفّر لك خياران لتقديم بيانات الاعتماد إلى تطبيقك. يمكنك ضبط متغيّر البيئة GOOGLE_APPLICATION_CREDENTIALS أو يمكنك تمرير المسار بشكل صريح إلى مفتاح حساب الخدمة في الرمز البرمجي. الخيار الأول أكثر أمانًا وننصح به بشدة.

لضبط متغيّر البيئة:

اضبط متغيّر البيئة GOOGLE_APPLICATION_CREDENTIALS على مسار ملف JSON الذي يحتوي على مفتاح حساب الخدمة. ينطبق هذا المتغيّر على جلسة واجهة الأوامر الحالية فقط، لذا إذا فتحت جلسة جديدة، عليك ضبط المتغيّر مرة أخرى.

‫Linux أو macOS

export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/service-account-file.json"

Windows

باستخدام PowerShell:

$env:GOOGLE_APPLICATION_CREDENTIALS="C:\Users\username\Downloads\service-account-file.json"

بعد إكمال الخطوات المذكورة أعلاه، ستتمكّن "بيانات الاعتماد التلقائية للتطبيق" (ADC) من تحديد بيانات الاعتماد بشكل ضمني، ما يتيح لك استخدام بيانات اعتماد حساب الخدمة عند الاختبار أو التشغيل في بيئات غير تابعة لـ Google.

ابدأ حزمة SDK على النحو التالي:

Node.js

initializeApp({
    credential: applicationDefault(),
    databaseURL: 'https://<DATABASE_NAME>.firebaseio.com'
});

Java

FirebaseOptions options = FirebaseOptions.builder()
    .setCredentials(GoogleCredentials.getApplicationDefault())
    .setDatabaseUrl("https://<DATABASE_NAME>.firebaseio.com/")
    .build();

FirebaseApp.initializeApp(options);

Python

default_app = firebase_admin.initialize_app()

متابعة

app, err := firebase.NewApp(context.Background(), nil)
if err != nil {
	log.Fatalf("error initializing app: %v\n", err)
}

#C

FirebaseApp.Create(new AppOptions()
{
    Credential = GoogleCredential.GetApplicationDefault(),
    ProjectId = "my-project-id",
});

بدء استخدام تطبيقات متعددة

في معظم الحالات، ما عليك سوى إعداد تطبيق واحد تلقائي. يمكنك الوصول إلى الخدمات من هذا التطبيق بطريقتين متكافئتين:

Node.js

// Initialize the default app
const defaultApp = initializeApp(defaultAppConfig);

console.log(defaultApp.name);  // '[DEFAULT]'

// Retrieve services via the defaultApp variable...
let defaultAuth = getAuth(defaultApp);
let defaultDatabase = getDatabase(defaultApp);

// ... or use the equivalent shorthand notation
defaultAuth = getAuth();
defaultDatabase = getDatabase();

Java

// Initialize the default app
FirebaseApp defaultApp = FirebaseApp.initializeApp(defaultOptions);

System.out.println(defaultApp.getName());  // "[DEFAULT]"

// Retrieve services by passing the defaultApp variable...
FirebaseAuth defaultAuth = FirebaseAuth.getInstance(defaultApp);
FirebaseDatabase defaultDatabase = FirebaseDatabase.getInstance(defaultApp);

// ... or use the equivalent shorthand notation
defaultAuth = FirebaseAuth.getInstance();
defaultDatabase = FirebaseDatabase.getInstance();

Python

# Import the Firebase service
from firebase_admin import auth

# Initialize the default app
default_app = firebase_admin.initialize_app(cred)
print(default_app.name)  # "[DEFAULT]"

# Retrieve services via the auth package...
# auth.create_custom_token(...)

متابعة

// Initialize default app
app, err := firebase.NewApp(context.Background(), nil)
if err != nil {
	log.Fatalf("error initializing app: %v\n", err)
}

// Access auth service from the default app
client, err := app.Auth(context.Background())
if err != nil {
	log.Fatalf("error getting Auth client: %v\n", err)
}

#C

// Initialize the default app
var defaultApp = FirebaseApp.Create(new AppOptions()
{
    Credential = GoogleCredential.GetApplicationDefault(),
});
Console.WriteLine(defaultApp.Name); // "[DEFAULT]"

// Retrieve services by passing the defaultApp variable...
var defaultAuth = FirebaseAuth.GetAuth(defaultApp);

// ... or use the equivalent shorthand notation
defaultAuth = FirebaseAuth.DefaultInstance;

تتطلّب بعض حالات الاستخدام إنشاء تطبيقات متعددة في الوقت نفسه. على سبيل المثال، قد تريد قراءة البيانات من Realtime Database لمشروع Firebase واحد وإنشاء رموز مميزة مخصصة لمشروع آخر. أو قد ترغب في مصادقة تطبيقين باستخدام بيانات اعتماد منفصلة. تتيح لك حزمة تطوير البرامج (SDK) لمنصّة Firebase إنشاء تطبيقات متعددة في الوقت نفسه، ولكل منها معلومات الإعدادات الخاصة بها.

Node.js

// Initialize the default app
initializeApp(defaultAppConfig);

// Initialize another app with a different config
var otherApp = initializeApp(otherAppConfig, 'other');

console.log(getApp().name);  // '[DEFAULT]'
console.log(otherApp.name);     // 'other'

// Use the shorthand notation to retrieve the default app's services
const defaultAuth = getAuth();
const defaultDatabase = getDatabase();

// Use the otherApp variable to retrieve the other app's services
const otherAuth = getAuth(otherApp);
const otherDatabase = getDatabase(otherApp);

Java

// Initialize the default app
FirebaseApp defaultApp = FirebaseApp.initializeApp(defaultOptions);

// Initialize another app with a different config
FirebaseApp otherApp = FirebaseApp.initializeApp(otherAppConfig, "other");

System.out.println(defaultApp.getName());  // "[DEFAULT]"
System.out.println(otherApp.getName());    // "other"

// Use the shorthand notation to retrieve the default app's services
FirebaseAuth defaultAuth = FirebaseAuth.getInstance();
FirebaseDatabase defaultDatabase = FirebaseDatabase.getInstance();

// Use the otherApp variable to retrieve the other app's services
FirebaseAuth otherAuth = FirebaseAuth.getInstance(otherApp);
FirebaseDatabase otherDatabase = FirebaseDatabase.getInstance(otherApp);

Python

# Initialize the default app
default_app = firebase_admin.initialize_app(cred)

#  Initialize another app with a different config
other_app = firebase_admin.initialize_app(cred, name='other')

print(default_app.name)    # "[DEFAULT]"
print(other_app.name)      # "other"

# Retrieve default services via the auth package...
# auth.create_custom_token(...)

# Use the `app` argument to retrieve the other app's services
# auth.create_custom_token(..., app=other_app)

متابعة

// Initialize the default app
defaultApp, err := firebase.NewApp(context.Background(), nil)
if err != nil {
	log.Fatalf("error initializing app: %v\n", err)
}

// Initialize another app with a different config
opt := option.WithCredentialsFile("service-account-other.json")
otherApp, err := firebase.NewApp(context.Background(), nil, opt)
if err != nil {
	log.Fatalf("error initializing app: %v\n", err)
}

// Access Auth service from default app
defaultClient, err := defaultApp.Auth(context.Background())
if err != nil {
	log.Fatalf("error getting Auth client: %v\n", err)
}

// Access auth service from other app
otherClient, err := otherApp.Auth(context.Background())
if err != nil {
	log.Fatalf("error getting Auth client: %v\n", err)
}

#C

// Initialize the default app
var defaultApp = FirebaseApp.Create(defaultOptions);

// Initialize another app with a different config
var otherApp = FirebaseApp.Create(otherAppConfig, "other");

Console.WriteLine(defaultApp.Name); // "[DEFAULT]"
Console.WriteLine(otherApp.Name); // "other"

// Use the shorthand notation to retrieve the default app's services
var defaultAuth = FirebaseAuth.DefaultInstance;

// Use the otherApp variable to retrieve the other app's services
var otherAuth = FirebaseAuth.GetAuth(otherApp);

ضبط النطاقات لـ Realtime Database وAuthentication

إذا كنت تستخدم جهازًا افتراضيًا في Google Compute Engine مع بيانات الاعتماد التلقائية لتطبيق Google لـ Realtime Database أو Authentication، تأكَّد أيضًا من ضبط نطاقات الوصول الصحيحة. بالنسبة إلى Realtime Database وAuthentication، يجب أن تنتهي النطاقات بـ userinfo.email وإما cloud-platform أو firebase.database. للتحقّق من نطاقات الوصول الحالية وتغييرها، شغِّل الأوامر التالية باستخدام gcloud.

gcloud

# Check the existing access scopes
gcloud compute instances describe [INSTANCE_NAME] --format json

# The above command returns the service account information. For example:
  "serviceAccounts": [
   {
    "email": "your.gserviceaccount.com",
    "scopes": [
     "https://www.googleapis.com/auth/cloud-platform",
     "https://www.googleapis.com/auth/userinfo.email"
     ]
    }
  ],

# Stop the VM, then run the following command, using the service account
# that gcloud returned when you checked the scopes.

gcloud compute instances set-service-account [INSTANCE_NAME] --service-account "your.gserviceaccount.com" --scopes "https://www.googleapis.com/auth/firebase.database,https://www.googleapis.com/auth/userinfo.email"

الاختبار باستخدام بيانات اعتماد المستخدم النهائي في gcloud

عند اختبار Admin SDK محليًا باستخدام بيانات الاعتماد التلقائية لتطبيق Google التي تم الحصول عليها من خلال تشغيل gcloud auth application-default login، يجب إجراء تغييرات إضافية لاستخدام Firebase Authentication للأسباب التالية:

  • لا يقبل "Firebase Authentication" بيانات اعتماد المستخدم النهائي في gcloud التي تم إنشاؤها باستخدام معرّف عميل OAuth في gcloud.
  • يتطلب Firebase Authentication تقديم رقم تعريف المشروع عند الإعداد لهذا النوع من بيانات اعتماد المستخدم النهائي.

كحل بديل، يمكنك إنشاء "بيانات الاعتماد التلقائية للتطبيق" من Google في gcloud باستخدام معرّف عميل OAuth 2.0 الخاص بك. يجب أن يكون معرّف عميل OAuth من نوع تطبيق تطبيق متوافق مع الكمبيوتر المكتبي.

gcloud

gcloud auth application-default login --client-id-file=[/path/to/client/id/file]

يمكنك تحديد رقم تعريف المشروع صراحةً عند إعداد التطبيق أو استخدام متغيّر البيئة GOOGLE_CLOUD_PROJECT فقط. يتجنب الأخير الحاجة إلى إجراء أي تغييرات إضافية لاختبار التعليمات البرمجية الخاصة بك.

لتحديد رقم تعريف المشروع بشكل صريح:

Node.js

import { initializeApp, applicationDefault } from 'firebase-admin/app';

initializeApp({
  credential: applicationDefault(),
  projectId: '<FIREBASE_PROJECT_ID>',
});

Java

FirebaseOptions options = FirebaseOptions.builder()
    .setCredentials(GoogleCredentials.getApplicationDefault())
    .setProjectId("<FIREBASE_PROJECT_ID>")
    .build();

FirebaseApp.initializeApp(options);

Python

app_options = {'projectId': '<FIREBASE_PROJECT_ID>'}
default_app = firebase_admin.initialize_app(options=app_options)

متابعة

config := &firebase.Config{ProjectID: "<FIREBASE_PROJECT_ID>"}
app, err := firebase.NewApp(context.Background(), config)
if err != nil {
        log.Fatalf("error initializing app: %v\n", err)
}

#C

FirebaseApp.Create(new AppOptions()
{
    Credential = GoogleCredential.GetApplicationDefault(),
    ProjectId = "<FIREBASE_PROJECT_ID>",
});

الخطوات التالية

مزيد من المعلومات عن Firebase:

أضِف ميزات Firebase إلى تطبيقك: