> ## Documentation Index
> Fetch the complete documentation index at: https://www.ayrshare.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# نظرة عامة على توليد JWT

> أنشئ عنوان URL لربط الشبكات الاجتماعية بملف مستخدم.

export const PlansAvailable = ({plans = [], maxPackRequired}) => {
  let displayPlans = plans;
  if (plans && plans.length === 1) {
    const lowerCasePlan = plans[0].toLowerCase();
    if (lowerCasePlan === "business") {
      displayPlans = ["Launch", "Business", "Enterprise"];
    } else if (lowerCasePlan === "premium") {
      displayPlans = ["Premium", "Launch", "Business", "Enterprise"];
    }
  }
  return <Note>
Available on {displayPlans.length === 1 ? "the " : ""}
{displayPlans.join(", ").replace(/\b\w/g, l => l.toUpperCase())}{" "}
{displayPlans.length > 1 ? "plans" : "plan"}.

{maxPackRequired && <span onClick={() => window.open('https://www.ayrshare.com/docs/additional/maxpack', '_self')} className="flex items-center mt-2 cursor-pointer">
 <span className="px-1.5 py-0.5 rounded text-sm" style={{
    backgroundColor: '#C264B6',
    color: 'white',
    fontSize: '12px'
  }}>
   Max Pack required
 </span>
</span>}
</Note>;
};

<PlansAvailable plans={["business"]} maxPackRequired={false} />

تُنشئ [نقطة نهاية generateJWT](/apis/profiles/generate-jwt) عنوان URL لربط الشبكات الاجتماعية لـ User Profile واحد.
راجع [تكامل API لخطة Business وخطة Launch](/multiple-users/api-integration-business) لمزيد من التفاصيل.

## التبديل بين الملفات الشخصية

للتبديل بين جلسات الملفات الشخصية المختلفة (على سبيل المثال، عند الاختبار بعدة ملفات شخصية)، ستحتاج إلى تسجيل خروج الملف الشخصي الحالي أولاً. راجع [تسجيل الخروج التلقائي من جلسة الملف الشخصي](/multiple-users/api-integration-business#automatic-logout-of-a-profile-session) للاطلاع على تعليمات كيفية التعامل مع تبديل الملفات الشخصية بشكل صحيح.

## Private Key و Profile Key

### من أين تحصل على Private Key

يتم تضمين ملف Private Key (private.key) وملف JSON نموذجي لـ Postman مع [Integration Package](/multiple-users/api-integration-business#integration-package) الذي تتلقاه أثناء التسجيل.
يمكن أيضًا استرداد Integration Package في لوحة تحكم مطوري Ayrshare في صفحة API -> Integration Package.

### استخدام Private Key

نوصي بقراءة Private Key private.key من ملف وإرساله كسلسلة في حقل `privateKey`، مما يتيح لك الحفاظ على جميع الأحرف بما في ذلك أسطر جديدة.
يجب أن يكون Private Key دقيقًا، أي الحفاظ على جميع الأحرف بما في ذلك أسطر جديدة.
إذا قمت بلصق المفتاح في التعليمات البرمجية الخاصة بك، فقد تحتاج إلى استبدال أسطر جديدة يدويًا بحرف `\n` أو ترميز السلسلة بترميز URL.

يؤدي لصق المفتاح مباشرة في التعليمات البرمجية غالبًا إلى مشكلات.

## توليد JSON Web Token

مقطع فيديو مدته دقيقة واحدة يشرح كيفية توليد JSON Web Token (JWT):

<div class="video-container">
  <iframe width="380" height="200" src="https://www.youtube.com/embed/JI232HBWHWc" title="Generate a JSON Web Token" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" />
</div>

عنوان URL الخاص بـ JWT صالح لمدة **5 دقائق**. بعد 5 دقائق، يجب عليك إنشاء عنوان URL جديد لـ JWT.
راجع [Max Pack `expiresIn`](/apis/profiles/generate-jwt-overview#jwt-expires-in) لخيارات إضافية.

## فتح عنوان URL الخاص بـ JWT

افتح عنوان URL الخاص بـ JWT في علامة تبويب متصفح جديدة أو نافذة متصفح جديدة أو View Controller على iOS.

يمكنك التحكم في [إغلاق أو إعادة توجيه](/multiple-users/api-integration-business#opening-and-closing-the-social-linking-url) النافذة أو علامة التبويب الجديدة.

<Note>
  لا تسمح الشبكات الاجتماعية بفتح عنوان URL في iFrame أو إخفاء نطاق أصل الشريك المعتمد
  profile.ayrshare.com.
</Note>

## التحقق من عنوان URL الخاص بـ JWT

لا تتحقق نقطة نهاية `generateJWT` من عنوان URL الخاص بـ JWT المُعاد بشكل افتراضي.
على سبيل المثال، إذا تم تمرير Private Key تالف إلى `generateJWT`، فسيتم إرجاع عنوان URL على أي حال وسيؤدي عنوان URL إلى خطأ 401.

يمكنك التحقق من عنوان URL الخاص بـ JWT المُعاد بتضمين `verify: true` في معاملات جسم `generateJWT`. إذا تعذر التحقق من عنوان URL الخاص بـ JWT، فسيتم إرجاع خطأ. على سبيل المثال، إذا تمت إزالة حرف من Private Key، فسيتم إرجاع ما يلي:

```json JWT Error theme={"system"}
{
  "action": "JWT",
  "status": "error",
  "code": 189,
  "message": "Error generating JWT. Check the sent parameters, such as the privateKey has no extra tabs, spaces, or newlines. Also the entire private.key file including -----BEGIN RSA PRIVATE KEY----- and -----END RSA PRIVATE KEY-----. Error: secretOrPrivateKey must be an asymmetric key when using RS256"
}
```

نوصي باستخدام `verify: true` فقط في بيئة غير إنتاجية نظرًا لأن التحقق يستغرق وقت معالجة إضافيًا.

## الاختبار في Postman

**يوصى** أولاً باختبار إنشاء عنوان URL الخاص بـ JWT في [Postman](/testing/postman).
يتضمن Integration Package، الذي يتم العثور عليه في صفحة Primary Profile API Key من لوحة التحكم، ملف تكوين JSON نموذجي لـ Postman يتضمن كل ما تحتاجه للتحقق من إنشاء عنوان URL الخاص بـ JWT.
ما عليك سوى استيراد ملف التكوين إلى Postman، وملء Profile Key (الذي يمكن العثور عليه في لوحة تحكم مطوري Ayrshare بالتبديل إلى الملف الشخصي الذي تريد اختباره) في حقل *body* الخاص بـ `profileKey`، والنقر على زر *Send* الأزرق.
جميع الحقول الأخرى المطلوبة مملوءة بالفعل.

يمكنك أيضًا [توليد التعليمات البرمجية من Postman](/testing/postman#auto-generate-api-code-with-postman)، أو قراءة ملف المفتاح من دليل أو قاعدة بيانات.

## طريقة ربط Instagram

يمكن ربط حسابات Instagram بـ [طريقتين](/dashboard/connect-social-accounts/instagram): مباشرة عبر **Instagram Login**، أو عبر **Facebook Page متصلة**.
يتم التحكم في التدفق الذي يبدأ عند نقر المستخدم على زر Instagram في صفحة الربط الاجتماعي عادةً بواسطة إعداد [Instagram Login](/multiple-users/manage-user-profiles#instagram-login) على مستوى الحساب في لوحة التحكم.

يتيح لك معامل الجسم `instagramLinkMethod` لـ [نقطة نهاية generateJWT](/apis/profiles/generate-jwt) تجاوز هذا الإعداد لعنوان URL واحد للربط:

| القيمة      | تدفق ربط Instagram                                     |
| ----------- | ------------------------------------------------------ |
| `instagram` | تسجيل دخول مباشر إلى Instagram. لا يلزم Facebook Page. |
| `facebook`  | الربط عبر Facebook Page متصلة.                         |

على سبيل المثال، إذا كان افتراضي حسابك هو ربط Facebook Page، فإن ما يلي يفرض تسجيل دخول Instagram مباشرًا لجلسة الربط هذه فقط:

```json Instagram Link Method theme={"system"}
{
  "instagramLinkMethod": "instagram"
}
```

سيتضمن عنوان URL الخاص بـ JWT الذي تم إنشاؤه التجاوز، وسيبدأ النقر على زر Instagram في صفحة الربط التدفق المطلوب لمدة تلك الجلسة — بما في ذلك عبر إعادة توجيه التفويض في Instagram/Facebook.

بعض الأمور التي يجب معرفتها:

* ينطبق التجاوز فقط على صفحة الربط المفتوحة من عنوان URL المُعاد. لا يغير إعداد Instagram Login على مستوى الحساب أو يؤثر على جلسات الربط الأخرى.
* إذا تم حذف `instagramLinkMethod`، تستخدم صفحة الربط إعداد حسابك، تمامًا كما كان من قبل.
* إذا تم إرسال قيمة غير صالحة، يتم إرجاع خطأ `400` يسرد القيم الصالحة (`instagram`، `facebook`).
* راجع [اختلافات الميزات](/multiple-users/manage-user-profiles#direct-instagram-login-vs-facebook-page-authentication) بين التدفقين قبل اختيار التجاوز — بعض ميزات Instagram، مثل البحث عن الوسوم والتعاون، متاحة فقط مع مصادقة Facebook Page.

## JWT Expires In

<PlansAvailable plans={["business"]} maxPackRequired />

إذا كنت تريد مهلة JWT أطول من الافتراضي البالغ 5 دقائق، فقم بتضمين حقل `expiresIn`.

على سبيل المثال، أرسل JSON التالي لضبط عنوان URL الخاص بـ JWT ليكون صالحًا لمدة 30 دقيقة:

```json JWT Expires In theme={"system"}
{
  "expiresIn": 30
}
```

يتيح لك ذلك [إرسال الرابط بالبريد الإلكتروني](/apis/profiles/generate-jwt-overview#connect-accounts-email) إلى مستخدميك بدلاً من الحاجة إلى الانتقال إلى تطبيقك أو منصتك.
حالة الاستخدام الشائعة هي عندما يحتاج مستخدمك إلى إعادة توصيل حساب اجتماعي، يمكنك إرسال رابط JWT بالبريد الإلكتروني إليه لإعادة ربط الحساب الاجتماعي مباشرة بدلاً من الاضطرار إلى الانتقال إلى منصتك.

<Warning>
  تأكد من مراجعة فريق الأمان الخاص بك بشأن المدة التي يريد نشاطك التجاري إبقاء JWT فيها نشطًا.
  أوقات انتهاء الصلاحية الأطول تخلق مخاطر إضافية لوصول طرف غير مصرح به إلى الرابط.
</Warning>

## التكاملات

### Bubble.io JWT

إذا كنت مستخدم Bubble، فيُرجى مراجعة *Generate JWT Token* في قسم Bubble.io للتعليمات:

<Card title="Bubble Generate JWT" icon="link" href="/packages-guides/bubble#generate-jwt-token-in-bubble" horizontal />

### Mobile JWT

توضح [أمثلة التعليمات البرمجية للأجهزة المحمولة](/apis/profiles/generate-jwt-overview#mobile-code-examples) التالية بلغات Swift وFlutter وReact Native كيفية إطلاق صفحة الربط الاجتماعي على جهاز iOS.
استبدل متغير السلسلة النصية `jwtURL` بالقيمة المُعادة من [نقطة نهاية /generateJWT](/apis/profiles/generate-jwt).

#### Swift (iOS)

في Swift، استخدم `UIViewController` و`SFSafariViewControllerDelegate`.
لا نوصي باستخدام `WebView` لأن بعض الشبكات الاجتماعية مثل Facebook وGoogle تحظر المصادقة.

#### Flutter (Dart)

في Flutter (Dart)، لا يوجد ما يعادل مباشرة `UIViewController` أو `SFSafariViewController`.
ومع ذلك، يمكنك تحقيق وظيفة مماثلة باستخدام حزمة `url_launcher` لفتح عناوين URL للويب.

#### React Native

لا يحتوي React Native أيضًا على مكافئ مباشر لـ `SFSafariViewController`، ولكن يمكنك تحقيق نتيجة مماثلة باستخدام واجهة برمجة تطبيقات `WebBrowser` التي توفرها `expo-web-browser`، والتي تفتح عنوان URL في نافذة متصفح مشروطة تشترك في ملفات تعريف الارتباط مع متصفح النظام. وإلا يمكنك استخدام دالة `Linking` المدمجة في React Native لفتح Safari: `await Linking.canOpenURL(jwtURL);`

#### أمثلة التعليمات البرمجية للأجهزة المحمولة

<CodeGroup>
  ```swift Swift theme={"system"}
  import UIKit
  import SafariServices

  class ViewController: UIViewController, SFSafariViewControllerDelegate {
      
      var jwtURL = "https://profile.ayrshare.com?domain=acme&jwt=eyJhbGciOiJ"

      override func viewDidLoad() {
          super.viewDidLoad()
          setupButton()
      }
      
      func setupButton() {
          let button = UIButton(type: .system)
          button.frame = CGRect(x: (view.bounds.width - 200) / 2, y: (view.bounds.height - 50) / 2, width: 200, height: 50)
          button.setTitle("Open URL", for: .normal)
          button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
          view.addSubview(button)
      }

      @objc func buttonTapped() {
          openURLInInAppBrowser()
      }

      func openURLInInAppBrowser() {
          if let url = URL(string: jwtURL) {
              let safariVC = SFSafariViewController(url: url)
              safariVC.delegate = self
              present(safariVC, animated: true, completion: nil)
          }
      }

      // Optional: If you want to handle when the in-app browser is closed
      func safariViewControllerDidFinish(_ controller: SFSafariViewController) {
          controller.dismiss(animated: true, completion: nil)
      }
  }
  ```

  ```dart Flutter theme={"system"}
  /** yaml dependencies
    dependencies:
      flutter:
        sdk: flutter
      url_launcher: ^6.2.1
  */

  import 'package:flutter/material.dart';
  import 'package:url_launcher/url_launcher.dart';

  void main() {
    runApp(MyApp());
  }

  class MyApp extends StatelessWidget {
    @override
    Widget build(BuildContext context) {
      return MaterialApp(
        title: 'URL Launcher Example',
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
        home: MyHomePage(),
      );
    }
  }

  class MyHomePage extends StatelessWidget {
    final String jwtURL = "https://profile.ayrshare.com?domain=acme&jwt=eyJhbGciOiJ";

    @override
    Widget build(BuildContext context) {
      return Scaffold(
        appBar: AppBar(
          title: Text('URL Launcher Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              openURLInBrowser(context);
            },
            child: Text('Open URL'),
          ),
        ),
      );
    }

    void openURLInBrowser(BuildContext context) async {
      if (await canLaunch(jwtURL)) {
        await launch(jwtURL);
      } else {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(
            content: Text('Could not launch $jwtURL'),
          ),
        );
      }
    }
  }
  ```

  ```jsx React Native theme={"system"}
  /**
  • Using the API provided by expo-web-browser,
  • which opens a URL in a modal browser window that shares cookies
  • with the system browser.

  • Learn more about expo: https://reactnative.dev/docs/environment-setup?guide=quickstart
  • and running the following command:
  • expo install expo-web-browser
  */

  import React from 'react';
  import { StyleSheet, Button, View } from 'react-native';
  import * as WebBrowser from 'expo-web-browser';

  export default function App() {
    const jwtURL = 'https://profile.ayrshare.com?domain=acme&jwt=eyJhbGciOiJ';

    const openURLInBrowser = async () => {
      try {
        await WebBrowser.openBrowserAsync(jwtURL);
        // Optional: WebBrowser.openBrowserAsync returns a promise that resolves with an object containing
        // 'type' that can be 'cancelled' or 'dismissed'. You can use this to handle when the browser is closed.
      } catch (error) {
        console.error(error);
      }
    };

    return (
      <View style={styles.container}>
        <Button title="Open URL" onPress={openURLInBrowser} />
      </View>
    );
  }

  const styles = StyleSheet.create({
    container: {
      flex: 1,
      justifyContent: 'center',
      alignItems: 'center',
    },
  });
  ```
</CodeGroup>

## البريد الإلكتروني لربط الحسابات

<max_pack />

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

### JSON لربط الحسابات

على سبيل المثال، سيرسل JSON التالي بريدًا إلكترونيًا إلى `john@user.com` باسم الشركة ACME، والبريد الإلكتروني للاتصال `support@mycompany.com`، وروابط إلى الشروط وسياسة الخصوصية:

```json Example Contact Email Request theme={"system"}
/**
  All fields are in the email object required.
  Missing fields will cause the email to fail.
*/
{
  "email": {
    "to": "john@user.com",
    "contactEmail": "support@mycompany.com",
    "company": "ACME",
    "termsUrl": "https://www.ayrshare.com/terms",
    "privacyUrl": "https://www.ayrshare.com/privacy",
    "expiresIn": 60
  }
}
```

ستتضمن الاستجابة ما يلي إذا تم ضبط البريد الإلكتروني ووقت انتهاء الصلاحية:

```json Example Contact Email Response theme={"system"}
{
  "emailSent": true,
  "expiresIn": "30m"
}
```

### مثال البريد الإلكتروني JWT لربط الحسابات

فيما يلي مثال على بريد إلكتروني يحتوي على رابط Connect Account الذي يفتح صفحة الربط الاجتماعي:

<img src="https://mintcdn.com/ayrshare-docs/Nmrhj2Gh7WSf62Bh/images/apis/profiles/jwt-email.webp?fit=max&auto=format&n=Nmrhj2Gh7WSf62Bh&q=85&s=fbe4ee86ca59c26a5bd5b289fda96b8b" alt="JWT Email" width="563" class="center" data-path="images/apis/profiles/jwt-email.webp" />

سيأتي البريد الإلكتروني من العنوان:

`Social Connect Hub <connect@socialconnecthub.com>`
