# هل يمكن للمستخدم غير المسؤول إصدار مفتاح API الخاص به؟

**URL:** https://meta.discourse.org/t/can-non-admin-user-issue-their-own-api-key/173226
**Category:** Development
**Tags:** rest-api
**Created:** [14 ديسمبر 2020، 9:31ص UTC](https://meta.discourse.org/t/can-non-admin-user-issue-their-own-api-key/173226 "2020-12-14T09:31:28Z")
**Posts on this page:** 14
**Page:** 1

<div class="post-metadata">

### Author: ![KengoTODA](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/kengotoda/32/203231_2.png) [@KengoTODA](https://meta.discourse.org/u/KengoTODA)
#### Post date: [14 ديسمبر 2020، 9:31ص UTC](https://meta.discourse.org/t/can-non-admin-user-issue-their-own-api-key/173226/1 "2020-12-14T09:31:28Z")

</div>

مرحبًا 👋،

أنا أقوم بإنشاء إجراء على GitHub للنشر في منتدى Discourse.  
وجدت واجهة برمجة التطبيقات للنشر، غير أن الوثائق تشير إلى أن [مستخدمي Discourse بحاجة إلى إنشاء مفتاح API من لوحة الإدارة](https://docs.discourse.org/#authentication)، رغم أن المستخدمين غير المسؤولين ليس لديهم لوحة إدارة. هنا لدي عدة أسئلة:

- هل تم تصميم مفتاح API حتى للمستخدمين غير المسؤولين؟
  - آمل ذلك نظرًا لـ [User API key instead of Admin API key?](https://meta.discourse.org/t/user-api-key-instead-of-admin-api-key/59713)

- إذا كان الأمر كذلك، كيف يمكن للمستخدمين غير المسؤولين إنشاء مفتاح API الخاص بهم؟
- إذا كان الأمر كذلك، لتمكين مفتاح API للمستخدمين غير المسؤولين، هل توجد أي إعدادات ضرورية؟
  - صفحة تفضيلات المنتدى لا تحتوي على واجهة لإنشاء مفتاح API. لذا أفترض أن هناك بعض الإعدادات التي تسمح للمستخدمين بإصدار مفاتيح API الخاصة بهم.

شكرًا مقدّمًا! 🙏

---

<div class="post-metadata">

### Author: ![osioke](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/osioke/32/238946_2.png) [@osioke](https://meta.discourse.org/u/osioke)
#### Post date: [14 ديسمبر 2020، 10:14ص UTC](https://meta.discourse.org/t/can-non-admin-user-issue-their-own-api-key/173226/2 "2020-12-14T10:14:02Z")

</div>

مرحبًا @KengoTODA، أهلاً بك هنا! 🙂 👋

سيكون هذا الرابط مفيدًا لما وصفته: [User API keys specification](https://meta.discourse.org/t/user-api-keys-specification/48536)

---

<div class="post-metadata">

### Author: ![KengoTODA](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/kengotoda/32/203231_2.png) [@KengoTODA](https://meta.discourse.org/u/KengoTODA)
#### Post date: [14 ديسمبر 2020، 12:35م UTC](https://meta.discourse.org/t/can-non-admin-user-issue-their-own-api-key/173226/3 "2020-12-14T12:35:18Z")

</div>

شكرًا لك! لقد راجعت جزء “تدفق توليد مفتاح API”.

لقد فهمت أنه مخصص لتطبيقات الويب التي يمكنها توفير عنوان URL لـ `auth_redirect`.  
هل توجد طريقة موصى بها لـ CLI أو GitHub Actions؟

---

<div class="post-metadata">

### Author: ![blake](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/blake/32/157322_2.png) [@blake](https://meta.discourse.org/u/blake)
#### Post date: [14 ديسمبر 2020، 6:03م UTC](https://meta.discourse.org/t/can-non-admin-user-issue-their-own-api-key/173226/4 "2020-12-14T18:03:52Z")

</div>

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

---

<div class="post-metadata">

### Author: ![riking](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/riking/32/170938_2.png) [@riking](https://meta.discourse.org/u/riking)
#### Post date: [14 ديسمبر 2020، 8:53م UTC](https://meta.discourse.org/t/can-non-admin-user-issue-their-own-api-key/173226/5 "2020-12-14T20:53:08Z")

</div>

للبرامج عبر سطر الأوامر (CLI)، إذا كان ذلك ضروريًا، يمكنك تشغيل خادم ويب محلي واستخدام عنوان URL من نوع `http://localhost:XXXXX/callback`. تتعامل التطبيق بطريقة مشابهة.

---

<div class="post-metadata">

### Author: ![KengoTODA](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/kengotoda/32/203231_2.png) [@KengoTODA](https://meta.discourse.org/u/KengoTODA)
#### Post date: [14 ديسمبر 2020، 9:11م UTC](https://meta.discourse.org/t/can-non-admin-user-issue-their-own-api-key/173226/6 "2020-12-14T21:11:26Z")

</div>

حسناً، سأجرب، شكراً لدعمك!

---

<div class="post-metadata">

### Author: ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)
#### Post date: [14 ديسمبر 2020، 9:25م UTC](https://meta.discourse.org/t/can-non-admin-user-issue-their-own-api-key/173226/7 "2020-12-14T21:25:57Z")

</div>

يمكنك إنشاء مفتاح API للمستخدم باتباع الرابط التالي: [Generate User API Keys for testing](https://meta.discourse.org/t/generating-user-api-keys-for-testing/145744?u=falco)

---

<div class="post-metadata">

### Author: ![KengoTODA](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/kengotoda/32/203231_2.png) [@KengoTODA](https://meta.discourse.org/u/KengoTODA)
#### Post date: [15 ديسمبر 2020، 1:12ص UTC](https://meta.discourse.org/t/can-non-admin-user-issue-their-own-api-key/173226/8 "2020-12-15T01:12:36Z")

</div>

أعمل في [هذا الفرع](https://github.com/KengoTODA/sonar-update-center-action/tree/54212084e9ec8ab2c364ec5e96bf1fac7301a557)، ونجحت في تشغيل الأمر باستخدام `localhost` كعنوان إعادة توجيه. ومع ذلك، بعد الضغط على زر التفويض، أبلغت الصفحة [https://meta.discourse.org/user-api-key](https://meta.discourse.org/user-api-key) عن خطأ في JavaScript ولم تتمكن من إكمال العملية. يعمل [سكربت Ruby](https://meta.discourse.org/t/generating-user-api-keys-for-testing/145744) لكنه يفشل أيضًا عند إضافة معلمة `auth_redirect`.

إليك الاستثناء الذي أبلغت عنه وحدة تحكم المتصفح:

```plaintext
Uncaught TypeError: Cannot set property 'isReadOnly' of undefined
    at Function.createCurrent (_application-42d4413fabab7a4b12e0c25fb01f736af560aa283089071a8493f37c9b042a4a.js:44867)
    at Function.current (_application-42d4413fabab7a4b12e0c25fb01f736af560aa283089071a8493f37c9b042a4a.js:8816)
    at Object.initialize (_application-42d4413fabab7a4b12e0c25fb01f736af560aa283089071a8493f37c9b042a4a.js:70403)
    at Object.i.initialize (_application-42d4413fabab7a4b12e0c25fb01f736af560aa283089071a8493f37c9b042a4a.js:7001)
    at _ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js:49660
    at i.each (_ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js:67904)
    at i.walk (_ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js:67891)
    at n.each (_ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js:67858)
    at n.topsort (_ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js:67758)
    at t._runInitializer (_ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js:49667)

```

سأرفق لقطة شاشة من تحليل كود JavaScript. يبدو أن `siteAttributes` متوقع أن تكون قيمة صحيحة، لكنها `undefined`. إذا كان لديك أي اقتراح لي، يرجى إخباري. شكرًا لك!

 ![لقطة شاشة 2020-12-15 085706](https://global.discourse-cdn.com/meta/original/3X/d/0/d0d260abe0e7ccc86914eb764226478712f7d793.png)

---

<div class="post-metadata">

### Author: ![KengoTODA](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/kengotoda/32/203231_2.png) [@KengoTODA](https://meta.discourse.org/u/KengoTODA)
#### Post date: [18 ديسمبر 2020، 10:20ص UTC](https://meta.discourse.org/t/can-non-admin-user-issue-their-own-api-key/173226/9 "2020-12-18T10:20:46Z")

</div>

أقوم بالتحقيق في هذه المشكلة.

يُطلق JavaScript خطأً لأن طريقة POST لـ `/user-api-key` تُرجع 403، وطريقة [build\_not\_found\_page](https://github.com/discourse/discourse/blob/f296ca4b4a7e9491cb4a90a00f3c661919c36545/app/controllers/application_controller.rb#L797) في وحدة التحكم لا تستدعي طريقة `preload_anonymous_data` التي تخزن القيمة المُحمَّلة مسبقًا.

غير مؤكد سبب استجابة الخادم بـ 403 مع `<h1 class="title">عفوًا! هذه الصفحة خاصة.</h1>` عندما أضفت معلمة `auth_redirect`. حاولت استخدام نفس النطاق لـ URL الاستدعاء (للتحقق من مشكلة تنفيذ السكريبتات عبر المواقع) وبروتوكول HTTPS، لكن دون جدوى.

---

<div class="post-metadata">

### Author: ![riking](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/riking/32/170938_2.png) [@riking](https://meta.discourse.org/u/riking)
#### Post date: [18 ديسمبر 2020، 11:41م UTC](https://meta.discourse.org/t/can-non-admin-user-issue-their-own-api-key/173226/10 "2020-12-18T23:41:48Z")

</div>

يجب عليك إضافة النطاق (والمسار) إلى إعداد الموقع `allowed user api auth redirects`.

إذا كنت تُصدر طلبات HTTP يدويًا، فيجب أن يعمل `discourse://auth_redirect`.

---

<div class="post-metadata">

### Author: ![KengoTODA](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/kengotoda/32/203231_2.png) [@KengoTODA](https://meta.discourse.org/u/KengoTODA)
#### Post date: [20 ديسمبر 2020، 11:30ص UTC](https://meta.discourse.org/t/can-non-admin-user-issue-their-own-api-key/173226/11 "2020-12-20T11:30:14Z")

</div>

شكرًا لك، لقد وجدت [الإعدادات في `site_settings.yml`](https://github.com/discourse/discourse/blob/d8e2b497f78e2a054406775b4bcde3bcfab8bad1/config/site_settings.yml#L2325-L2327) وفهمت سبب استجابة طلبي برمز 403.

لا يعمل `discourse://auth_redirect` كما أتوقع، لذا سأحاول طلب إدخال الرمز المشفر من المستخدمين يدويًا، تمامًا كما في [كود Ruby](https://meta.discourse.org/t/generating-user-api-keys-for-testing/145744).

---

<div class="post-metadata">

### Author: ![KengoTODA](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/kengotoda/32/203231_2.png) [@KengoTODA](https://meta.discourse.org/u/KengoTODA)
#### Post date: [20 ديسمبر 2020، 1:39م UTC](https://meta.discourse.org/t/can-non-admin-user-issue-their-own-api-key/173226/12 "2020-12-20T13:39:25Z")

</div>

ملاحظة للمستخدمين الآخرين: لقد قمت بإنشاء وحدة node يمكن استدعاؤها عبر أمر `npx`. ستقوم بإنشاء مفتاح API مع نطاق `write`. آمل أن يساعد ذلك في عملية إعداد الأنظمة التي تحتاج إلى رمز Discourse API.

> **[GitHub - KengoTODA/discourse-api-key-generator: A tool which generates API key for Discourse](https://github.com/KengoTODA/discourse-api-key-generator)**
>
> A tool which generates API key for Discourse

---

<div class="post-metadata">

### Author: ![JQ331](https://avatars.discourse-cdn.com/v4/letter/j/41988e/32.png) [@JQ331](https://meta.discourse.org/u/JQ331)
#### Post date: [29 يوليو 2021، 11:47ص UTC](https://meta.discourse.org/t/can-non-admin-user-issue-their-own-api-key/173226/13 "2021-07-29T11:47:58Z")

</div>

تعديل: مرحبًا @KengoTODA. كان كود GitHub الخاص بك مفيدًا في توجيهي إلى الاتجاه الصحيح. لا زلت أعمل على حل بعض الأمور، ثم سأكتب ملخصًا لكيفية نجاحي في جعل الأمور تعمل.

---

<div class="post-metadata">

### Author: ![JQ331](https://avatars.discourse-cdn.com/v4/letter/j/41988e/32.png) [@JQ331](https://meta.discourse.org/u/JQ331)
#### Post date: [2 سبتمبر 2021، 4:27م UTC](https://meta.discourse.org/t/can-non-admin-user-issue-their-own-api-key/173226/14 "2021-09-02T16:27:21Z")

</div>

ساعدني كود GitHub الخاص بـ @KengoTODA بشكل كبير. لدي الآن نسخة عاملة من مصادقة المستخدمين على أساس كل مستخدم لإجراء مكالمات API إلى discourse. لقد دوّنت خطواتي هنا: [User API keys specification - #45 by JQ331](https://meta.discourse.org/t/user-api-keys-specification/48536/45)
