چله تابستون 🔥 چله تخفیف استثنایی راکت، این فرصت دیگه پیش نمیاد!
فرصت محدود، تعداد محدودسلام وقت بخیر دوستان
من یه API با جنگو دارم و یه برنامه Nuxt که هردو روی یک سرور مشترک هستند.
میخوام کاری کنم که هیچ کس نتونه مستقیم به آدرس /api
دسترسی داشته باشه و فقط خود برنامه Nuxt بتونه تو حالت SSR و کلاینتی API رو صدا بزنه.
یعنی فقط برنامه خودم اجازه داشته باشه درخواست به API بده، نه هر کسی که آدرس /api
رو داره.
آیا این امکانپذیره؟
چطور میتونم این رو درست کنم؟ اگه ایده یا راه حلی دارید ممنون میشم بهم بگید.
خب یه پروکسی داخلی بساز, خیلی ساده هست:
مثلا اینو بساز:
/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 زده میشه.
سلام و وقت بخیر
به ذهن من 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')
یا بیای از تو آپاچی اینو محدود کنی که فقط لوکال هاست بهش دسترسی داشته باشه
حالا هرکدوم راحت تری
درود ممنونم بابت پاسخگویی.
۱- اگر مسیر تغییر کنه باز همچنان کاربر میتونه از پنجره نتورک تشخیص بده درخواست ها کجا فرستاده میشن
2- اگر برای api هم رمز بزارم برای هر fetch که ارسال میشه باز باید رمز و توکن ست کنم. در صورتی که توی حالت عادی کاربران من نیاز به ورود ندارن و یوزی محسوب نمیشن.
3- روش جالبیه، تقریبا مشابه همین رو انجام دادم اما مشکلی که بود چون برنامه من SSR هست. یک سری درخواست ها (axios) از سمت کلاینت کاربر ارسال میشن که متاسفانه اون درخواست ها چون از سمت سرور نیستن مسدود میشن.
خب یه پروکسی داخلی بساز, خیلی ساده هست:
مثلا اینو بساز:
/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 زده میشه.
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟