วิธีการปิดการใช้งานอินเทอร์เฟซแบบเรียกดูได้ของ django-rest-framework


150

ฉันใช้Django ส่วนที่เหลือกรอบ มันมีรูปแบบการจัดทำเอกสารด้วยตนเอง API ที่สามารถเรียกดูได้ของ Django ที่ยอดเยี่ยม แต่ทุกคนสามารถเยี่ยมชมหน้าเหล่านั้นและใช้อินเทอร์เฟซเพื่อเพิ่มข้อมูล (POST) ฉันจะปิดการใช้งานได้อย่างไร


ใช่ผู้ใช้สามารถเข้าสู่ระบบและใช้ API แต่ฉันไม่ต้องการแสดงหน้าเบราส์ที่สามารถเรียกดูได้ของผู้ดูแลระบบ
iForests

คำตอบ:


246

คุณเพียงแค่ลบ API renderer ที่สามารถเรียกดูได้ออกจากรายการ renderers ที่รองรับของคุณเพื่อดู

โดยทั่วไป:

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
    )
}

พื้นฐานต่อการดู:

class MyView(...):
    renderer_classes = [renderers.JSONRenderer]

นอกเหนือ :

ในหลายกรณีที่ผมคิดว่ามันเป็นความอัปยศที่คนจะเลือกที่จะปิดการใช้งาน API สามารถเรียกดูได้ในกรณีใด ๆ เป็นมันช่วยให้นักพัฒนาที่ยิ่งใหญ่ใด ๆ ที่ทำงานเกี่ยวกับ API และมันไม่ได้ให้พวกเขามีสิทธิ์อื่น ๆ ที่พวกเขามิฉะนั้นจะมี ฉันสามารถเห็นได้ว่าอาจมีเหตุผลทางธุรกิจในการทำเช่นนั้นในบางกรณี แต่โดยทั่วไปฉันคิดว่ามันเป็นสินทรัพย์ขนาดใหญ่ แม้ว่าในบางกรณีอาจมีรายละเอียดปรากฏขึ้น (เช่นชื่อของการกระทำที่กำหนดเอง) ที่ API ที่ไม่ใช่สาธารณะอาจไม่ต้องการเปิดเผย

ดูคำตอบด้านล่างสำหรับรายละเอียดเพิ่มเติมเกี่ยวกับการ จำกัด ตัวแสดง API ที่เรียกดูได้เพื่อการพัฒนา


31
it's a big aid to any developers working on the API. พวกเขาไม่ควรมีไฟล์การตั้งค่าสำหรับการพัฒนาและการผลิตหรือไม่? ในการพัฒนาเปิดใช้ API ที่เรียกดูได้
Jacob Valenta

11
@JacobValenta ฉันคิดว่า Tom Christie หมายความว่านักพัฒนาบุคคลที่สามที่ใช้ API ของคุณควรจะสามารถใช้ API ที่เรียกดูได้
ดัสตินไวแอตต์

1
Yup ตาม @DustinWyatt
Tom Christie

7
@ TomChristie Tom ในระดับสิทธิ์การดูในกรณีของฉันกำลังป้องกันไม่ให้ผู้ใช้ที่ไม่ได้รับอนุญาตเห็นอะไรมากกว่า 401 ใน api ที่สามารถเรียกดูได้ยกเว้นข้อยกเว้นของมุมมองผู้ใช้เพราะฉันอนุญาตให้โพสต์ POST ที่ไม่ได้รับอนุญาต สิ่งนี้ทำให้ฟอร์ม HTML แสดงด้วยข้อมูลที่เติมข้อความอัตโนมัติที่ฉันไม่ต้องการเปิดเผย มีวิธีง่าย ๆ ในการป้องกันไม่ให้ผู้ใช้ที่ไม่ได้รับอนุญาตทำการสร้างแม่แบบกำหนดเองหรือไม่?
jeffjv

1
แค่คิดว่าฉันจะเพิ่มลูกค้าจำนวนมากหรือส่วนใหญ่อย่างชัดเจนขอวิธีการค้นพบ (เช่นอินเทอร์เฟซ REST API ที่เรียกดูได้) ให้ปิดใช้งานอย่างสมบูรณ์ ฉันไม่ได้พูดว่ามันสมเหตุสมผลหรือว่าถูกต้อง ... มันเป็นเพียงแค่
Ray Pendergraph

74

ในขณะที่คำตอบที่ได้รับการยอมรับสำหรับคำถามนี้ไม่สามารถตอบคำถามได้เหมือนเดิม แต่ฉันรู้สึกว่ามันไม่สามารถแก้ปัญหาที่เกิดขึ้นจริงได้

เพื่อความสมบูรณ์ในคำตอบนี้การปิดใช้งาน HTML API ที่เรียกดูได้นั้นทำได้โดยการลบออกจากคลาส renderer ดังนี้:

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
    )
}

อย่างไรก็ตามปัญหาที่แท้จริงของคำถามคือผู้คนสามารถโพสต์ไปยัง API โดยไม่ต้องมีการตรวจสอบสิทธิ์ ในขณะที่การลบแบบฟอร์มทำให้เห็นได้ชัดน้อยลงคำตอบนี้ไม่ได้ป้องกันจุดสิ้นสุดของ API

อย่างน้อยบางคนพบคำถามนี้และต้องการปกป้อง API จากการส่ง POST ที่ไม่ได้รับอนุญาตหรือไม่ได้รับอนุญาต กำลังมองหาการเปลี่ยนแปลงสิทธิ์ API

ต่อไปนี้จะตั้งค่าจุดสิ้นสุดทั้งหมดให้อ่านได้เว้นแต่ผู้ใช้จะได้รับการตรวจสอบสิทธิ์

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticatedOrReadOnly',
    )
}

หากคุณต้องการที่จะสมบูรณ์ซ่อน API IsAuthenticatedเว้นแต่ผู้ใช้จะเข้าสู่ระบบคุณยังสามารถใช้

FYI: สิ่งนี้จะลบแบบฟอร์มออกจาก API ที่เรียกดูได้ของ HTML เนื่องจากจะตอบสนองต่อการอนุญาต เมื่อผู้ใช้รับรองความถูกต้องเข้าสู่ระบบแบบฟอร์มจะสามารถใช้ได้อีกครั้ง

รอบโบนัส :

เปิดใช้งาน HTML API ที่เรียกดูได้ใน dev เท่านั้น:

DEFAULT_RENDERER_CLASSES = (
    'rest_framework.renderers.JSONRenderer',
)

if DEBUG:
    DEFAULT_RENDERER_CLASSES = DEFAULT_RENDERER_CLASSES + (
        'rest_framework.renderers.BrowsableAPIRenderer',
    )

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticatedOrReadOnly',
    ),
    'DEFAULT_RENDERER_CLASSES': DEFAULT_RENDERER_CLASSES
}

7
นี่ตอบคำถามได้โดยตรงมากกว่าคำตอบที่ได้รับการยอมรับและมีผู้โหวตมากที่สุด
เต่าน่ารัก

หากคุณเก็บไฟล์ปรับแต่งแยกต่างหากสำหรับโลคัลและการผลิตคุณสามารถใส่ไฟล์นี้ไว้ในไฟล์การตั้งค่า local.py ของคุณ (ตรวจสอบให้แน่ใจว่าได้เปลี่ยนข้างต้นจาก tuple เป็นรายการ):REST_FRAMEWORK['DEFAULT_RENDERER_CLASSES'].append('rest_framework.renderers.BrowsableAPIRenderer')
getup8

2
import rest_framework

For Production Only
 REST_FRAMEWORK = {
     'DEFAULT_RENDERER_CLASSES': (
         'rest_framework.renderers.JSONRenderer',
     )
 }

เพียงแค่เพิ่มสิ่งนี้ลงใน Settings.py ของคุณควรปิดใช้งาน Browsable API!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.