چله تابستون 🔥 چله تخفیف استثنایی راکت، این فرصت دیگه پیش نمیاد!

فرصت محدود، تعداد محدود
ثانیه
دقیقه
ساعت
روز
علیرضا
6 روز پیش توسط علیرضا مطرح شد
4 پاسخ

محدود کردن دسترسی به Api در وب سرور و برنامه

سلام وقت بخیر دوستان
من یه API با جنگو دارم و یه برنامه Nuxt که هردو روی یک سرور مشترک هستند.
می‌خوام کاری کنم که هیچ کس نتونه مستقیم به آدرس /api دسترسی داشته باشه و فقط خود برنامه Nuxt بتونه تو حالت SSR و کلاینتی API رو صدا بزنه.
یعنی فقط برنامه خودم اجازه داشته باشه درخواست به API بده، نه هر کسی که آدرس /api رو داره.
آیا این امکان‌پذیره؟
چطور می‌تونم این رو درست کنم؟ اگه ایده یا راه حلی دارید ممنون میشم بهم بگید.


ثبت پرسش جدید
محمدطاهر غلامی
تخصص : برنامه نویس وب
@MohammadTaher.GH 6 روز پیش مطرح شد
1

خب یه پروکسی داخلی بساز, خیلی ساده هست:
مثلا اینو بساز:

/server/api/my-api.ts

توش مثلا بنویس

export default defineEventHandler(async (event) => {
  const res = await $fetch('http://127.0.0.1:8000/api/something', {
    headers: {
      'x-custom-secret': 'MySuperSecretToken123'
    }
  })

  return res
})

و از اونجایی که /server/api/* فقط از سمت سرور اجرا میشه، توکنت امن می‌مونه و درخواست به Django با localhost زده میشه.


محمدطاهر غلامی
تخصص : برنامه نویس وب
@MohammadTaher.GH 6 روز پیش مطرح شد
0

سلام و وقت بخیر
به ذهن من 3روش میاد که برات توضیح میدم از ساده تر به پیچیده تر
1- مسیر api رو از /api/ تغییر بده یه چی دیگه بزار که معلوم نشه
2- برای ورود Auth بزار حالا با رمزعبور یا هر روشی که میخوای
3- حرفه ای ترین روش این هست که چون هردو روی 1سرور هستن پس برای ارتباط با هم از LocalHost استفاده میکنن. ما هم میتونیم این رو Middlewareاستفاده کنیم:

class LocalhostOnlyMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        if request.META.get('REMOTE_ADDR') not in ['127.0.0.1', '::1']:
            from django.http import HttpResponseForbidden
            return HttpResponseForbidden('دسترسی ممنوعه')
        return self.get_response(request)

بعدش هم تو setting.py :

MIDDLEWARE.insert(0, 'yourapp.middleware.LocalhostOnlyMiddleware')

یا بیای از تو آپاچی اینو محدود کنی که فقط لوکال هاست بهش دسترسی داشته باشه
حالا هرکدوم راحت تری


علیرضا
تخصص : داستان داریم حالا..
@mrkaf 6 روز پیش مطرح شد
0

درود ممنونم بابت پاسخگویی.
۱- اگر مسیر تغییر کنه باز همچنان کاربر میتونه از پنجره نتورک تشخیص بده درخواست ها کجا فرستاده میشن
2- اگر برای api هم رمز بزارم برای هر fetch که ارسال میشه باز باید رمز و توکن ست کنم. در صورتی که توی حالت عادی کاربران من نیاز به ورود ندارن و یوزی محسوب نمیشن.
3- روش جالبیه، تقریبا مشابه همین رو انجام دادم اما مشکلی که بود چون برنامه من SSR هست. یک سری درخواست ها (axios) از سمت کلاینت کاربر ارسال میشن که متاسفانه اون درخواست ها چون از سمت سرور نیستن مسدود میشن.


محمدطاهر غلامی
تخصص : برنامه نویس وب
@MohammadTaher.GH 6 روز پیش مطرح شد
1

خب یه پروکسی داخلی بساز, خیلی ساده هست:
مثلا اینو بساز:

/server/api/my-api.ts

توش مثلا بنویس

export default defineEventHandler(async (event) => {
  const res = await $fetch('http://127.0.0.1:8000/api/something', {
    headers: {
      'x-custom-secret': 'MySuperSecretToken123'
    }
  })

  return res
})

و از اونجایی که /server/api/* فقط از سمت سرور اجرا میشه، توکنت امن می‌مونه و درخواست به Django با localhost زده میشه.


علیرضا
تخصص : داستان داریم حالا..
@mrkaf 6 روز پیش مطرح شد
0

تشکر. ممنونم متوجه شدم.


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام