Ryan_NR
(Ryan)
22 يونيو 2020، 3:26م
1
مرحبًا!
أحاول تنفيذ استدعاء API لإنشاء موضوع جديد. Discourse API Docs
أستخدم Postman لإرسال مفتاح API واسم المستخدم ونوع المحتوى كعناوين، وبيانات JSON في الجسم.
لقد تأكدت من صحة اسم المستخدم ومفتاح API، لكن استدعاء API يعيد صفحة تسجيل الدخول بصيغة HTML.
هل هذا متوقع؟ وكيف يمكنني تجاوز هذه المشكلة؟
Falco
(Falco)
22 يونيو 2020، 4:35م
2
هل يمكنك نسخ ولصق نسخة cURL من استدعاء واجهة برمجة التطبيقات الذي تحاول تنفيذه؟
Ryan_NR
(Ryan)
23 يونيو 2020، 7:05ص
3
حسناً…
curl -X POST 'https://staging-discuss.newrelic.com/posts.json' \
-H 'Api-Username: RyanVeitch' -i \
-H 'Api-Key: My-API-Key' -i \
-H 'Content-Type: application/json' \
-d \
'{
"title": "My fancy title",
"raw": "Some random text to fill my topic",
"category": 212,
"created_at": "2020-06-22"
}'
في الطرفية، أحصل على هذا المخرجات:
HTTP/1.1 307 Temporary Redirect
Proxied-By: Service Gateway
Strict-Transport-Security: max-age=31536000; includeSubDomains
Location: https://staging-login.newrelic.com/login?return_to=https%3A%2F%2Fstaging-discuss.newrelic.com%2Fposts.json
content-type: text/plain;charset=UTF-8
content-length: 138
Redirecting to a different URI: https://staging-login.newrelic.com/login?return_to=https%3A%2F%2Fstaging-discuss.newrelic.com%2Fposts.json%
Ryan_NR
(Ryan)
23 يونيو 2020، 3:36م
4
أخبرني إذا كنت بحاجة إلى أي شيء آخر من جهتي للمساعدة في استكشاف الأخطاء وإصلاحها
Falco
(Falco)
23 يونيو 2020، 5:16م
5
يبدو أن لديك إعدادًا مخصصًا للغاية يتضمن وكيلًا في المنتصف.
هذا ليس سلوكًا قياسيًا في Discourse، لذا يبدو أن السبب هو جهاز الوكيل الخاص بك.
ربما يوجد رأس (Header) خاص يمكنك إرساله لتجاوز الوكيل؟ يجب التحقق من وثائق ذلك المنتج.
Ryan_NR
(Ryan)
24 يونيو 2020، 6:45ص
6
رائع! شكرًا لك @Falco - سأبدأ العمل مع فريق التطوير لدينا
Ryan_NR
(Ryan)
25 يونيو 2020، 9:31ص
7
مرحبًا @Falco ، لقد تمكنت من اجتياز الوكيل، لكنني الآن أواجه أخطاء 403 BAD CSRF.
أرى أن هذا الموضوع يبدو غير مكتمل نوعًا ما…
Can you share with me your actual ruby code to make this request? I’m unable to reproduce this locally. Here is the Postman json call I’m making and I’m always getting a response back:
[image]
[image]
Also I don’t think you need the extra post["raw"] parameter.
Parameters: {"title"=>"RT @love_se4: One of those hidden gems in the local community, you just have to try. Over 170 different gins. Proper mixologists who know h…", "raw"=>"https://twitter.com/se23_tweets/status/1127663613412630529"…
هل لديك أي أفكار حول كيفية تجاوز هذه الأخطاء؟
blake
(Blake Erickson)
25 يونيو 2020، 3:37م
8
لقد اختبرت أمر curl الخاص بكمثالك محليًا للتو، وهو يعمل بشكل مثالي لدي، لذا فإن الصيغة صحيحة تمامًا. هل من الممكن أن يكون الوكيل الوسيط يقوم بإزالة بعض رؤوس الطلب؟ قد يكون هذا هو السبب في حصولك على أخطاء CSRF السيئة، لأنه لم يعد بإمكانه قراءة أو الوصول إلى بيانات اعتماد واجهة برمجة التطبيقات.
Ryan_NR
(Ryan)
25 يونيو 2020، 3:51م
9
شكرًا لك @blake
الوكيل الخاص بنا مخصص بالكامل ومُصمم داخليًا وهو الطبقة الأمامية للجمهور.
أنا متصل بشبكة VPN داخل شبكتنا الداخلية، وأنا لا أتصل بعنوان URL العام، بل أتصل بعنوان URL للخلفية (الواقعة خلف الوكيل)، لذا، لا ينبغي أن تمر الطلبات عبر الوكيل.
مثال discourse في بيئة الاختبار لدينا هو الإصدار 2.3.10
هل يتصرف الـ API بشكل مختلف في هذا الإصدار؟
blake
(Blake Erickson)
25 يونيو 2020، 4:09م
10
لا، الإصدار v2.3.10 لا يزال يحتوي على كل ما يتعلق بالمصادقة القائمة على الرؤوس، لذا لا ينبغي أن يتصرف بشكل مختلف.
أنت تواجه هذا السطر:
protect_from_forgery
# Default Rails 3.2 lets the request through with a blank session
# we are being more pedantic here and nulling session / current_user
# and then raising a CSRF exception
def handle_unverified_request
# NOTE: API key is secret, having it invalidates the need for a CSRF token
unless is_api? || is_user_api?
super
clear_current_user
render plain: "[\"BAD CSRF\"]", status: 403
end
end
before_action :check_readonly_mode
before_action :handle_theme
before_action :set_current_user_for_logs
before_action :clear_notifications
before_action :set_locale
before_action :set_mobile_view
before_action :block_if_readonly_mode
وهو ما يعني أن طلبك معطوب بطريقة ما ولا يمكنه اكتشاف أنه طلب API.
blake
(Blake Erickson)
25 يونيو 2020، 4:25م
11
نظرًا لأن هذه نسخة تجريبية وليست محلية، فستكون لديك خدمة nginx أو خادم ويب آخر يعمل قبل الوصول إلى Discourse. من الممكن أن يقوم nginx بحذف بعض رؤوس الطلبات (headers) اعتمادًا على إعداداتك. قد تظهر هذه في سجلات nginx.
هذا هو السطر الذي يقرأ بيانات اعتماد واجهة برمجة التطبيقات (API) من رؤوس الطلبات. يمكنك أيضًا إضافة بعض عبارات التصحيح (debug statements) إلى هذا الملف لمعرفة ما إذا كانت الرؤوس تصل إلى هذه النقطة.
if uid
user = User.find_by(id: uid.to_i)
end
@env[CURRENT_USER_KEY] = user
return user
end
request = @request
user_api_key = @env[USER_API_KEY]
api_key = @env.blank? ? nil : @env[HEADER_API_KEY] || request[API_KEY]
auth_token = request.cookies[TOKEN_COOKIE] unless user_api_key || api_key
current_user = nil
if auth_token && auth_token.length == 32
limiter = RateLimiter.new(nil, "cookie_auth_#{request.ip}", COOKIE_ATTEMPTS_PER_MIN , 60)
if limiter.can_perform?
@user_token = UserAuthToken.lookup(auth_token,
Ryan_NR
(Ryan)
25 يونيو 2020، 5:07م
12
@blake
شكرًا لك! سأتواصل مع فريق التطوير الخاص بنا
نقدر مساعدتك