1masoud
6 سال پیش توسط 1masoud مطرح شد
10 پاسخ

اشکال در شapiنویسی

من با لاراول api نوشتم و طرف مقابل این api رو از من میگیره و با انگولار ui میزنه
من برای ثبت نام در سایت گفتم که یک tokenبساز این توکن در post man درست کار میکنه یعنی در سیستم ثبت نام میکنم و یک توکن میده برای وارد شدن یوزر و پسورد رو میزنم و authorization=token این قرار میدم وارد محیط کار میشه اما الان طرف که ui میزنه میگه چطوری authorization=token در انگولار قرار بدم تا وارد سایت بشم ابا من در قسمت backend باید کاری کنم ارورش اینه

app.js:1 CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token


ثبت پرسش جدید
1masoud
تخصص : php,laravel
@masoudproton 6 سال پیش مطرح شد
1

@ali.bayat
@Alimotreb
از این کد در backendاستفاده کردم نشد
"Access-Control-Allow-Origin" : "*",
"Access-Control-Allow-Methods" : "GET,POST,PUT,DELETE,OPTIONS",
"Access-Control-Allow-Headers": "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With"
}


Alimotreb
تخصص : کانفیگ سرور و برنامه نویس
@Alimotreb 6 سال پیش مطرح شد
1

سلام
@masoudproton

خودتون اول در post man تست هارو بگیرید
اگر اوکی باشه
اون طرف باید طبق مستندات بره جلو
و موارد رو رعایت کنه
نوع درخواستشو هم مشخص کنه که ارور نگیره


1masoud
تخصص : php,laravel
@masoudproton 6 سال پیش آپدیت شد
1

@Alimotreb
گفتم که در postman درست اجرا میشه در مرورگر این پیغام داده میشه
نوع درخواست رو چطوری مشخص کنه منظورتون در انگولار هست دیگه یعنی اونجا باید نوع رو مشخص کنه


سید محمد حسین موسوی
تخصص : FullStack Developer
@SeyedMH.Mosavi 6 سال پیش آپدیت شد
2

توضیحاتت یکم گنگه اما اگر منظورت کلا اینه که چطوری طرف تو انگولار یا react یا هر چیزه دیگه ای بتونه به api هایی که نیاز به توکن دارند دسترسی پیدا کنه؟
برای اینکار اولین باری که کاربر از سمت ui یا بهتر بگم سمت کلاینت درخواست لاگین می ده و اگر درست باشه، شما یه token بهش پاس می دی که اون وظیفه داره سمت کلاینت توکن رو ذخیره کنه. حالا تو webstorage یا هر جای دیگه. و بعد هر بار که می خواد یه api سمت سرور رو درخواست بده می ره و اون مقدار رو از تو Webstorage می خونه و تو هدر ریکوئست توکن رو هم اضافه می کنه.
حالا شما یه سری api داری که برای کاربرهایی که لاگین کردن و احراز هویت کردن نوشته شده. مثلا ویرایش پروفایل.
تو api های مورد نظرت هدر ریکوئست رو می خونی و توکن رو بررسی می کنی. چنتا حالت پیش می یاد:
کلا توکنی ارسال نکرده
توکن ارسال کرده ولی توکنش نامعتبره و الکیه
توکن ارسال کرده ولی تاریخش نامعتبره و مدت زمان اعتبارش تموم شده
توکن ارسال کرده ولی برای سایت شما نیست
همه مواردی که می تونه پیش بیاد و نامعتبره و شما در نتیجه درخواست رو ریجکت می کنی و پیغام مربوطه رو می فرستی
اما اگر درسته که نتیجه رو نشون می دی.
برای بررسی توکن و احرازش یا متدهای مربوطه به صورت توکار داخل فریم ورک یا کتابخونه ای که داری ازش استفاده می کنی وجود داره یا باید جست و جو کنی و کدش رو بنویسی.
این بخش اول سوالت

اما اگر همه چی درسته ولی کلا از سمت کلاینت نمی تونه درخواستی بفرسته و خطای Access-Control-Allow-Origin می ده علتش اینه که بصورت پیش فرض وب سرور اجازه نمی ده که شما از هر جایی که دوست داشتی درخواست رو ارسال کنی و اون هم بگه چشم!
باید دوتاشون هم تو یه وب سرور باشند و برای تست باید کدهای انگولار شما هم تو همون وب سرور و آدرسی باشه که کدهای بکندت هستند ولی می تونی بصورت مشخص یه سری وب سرور دیگه با ادرس های مختلف رو دستی اضافه کنی و یا کلا ازاد بزاری و هرکی از هرجایی که خواست ریکوئست رو بفرسته و نتیجه رو بگیره. زمانی این بدرد می خوره که شما بخوای api ات به جز سایتت تو اپلیکیشن های موبایل هم درست کار کنه یا حداقل بخوای کارت رو تست کنی.
اون کدی هم که نوشتی ظاهرا باید این قضیه رو درست کنه اگر مشکل در حالت دومه. البته من php کار نکردم که بدونم این کدت واقعا درسته و برای همین منظوره و کامله یا نه ولی مفهومش که همون قضیه رو داره می رسونه. و اگر مشکلی تو بخش دوم داری باید سرچ کنی تا کد صحبح رو پیدا کنی.

اما ظاهر خطای شما داره یه چیزه سومی رو می گه!! که علتش هم اینه که CSRF Token رو بهش پاس ندادی. اینکار برای یه سری ملاحظات امنیتیه که کلا می تونی غیرفعالش کنی که اصلا و به هیچ وجه درست نیست. بطور معمولی هر درخواستی که به سمت سرور ارسال می شه خارج از اینکه api هست یا بصورت غیر api ای کدت با مثلا jquery و ajax داره کار می کنه یا post معمولی فرمه، باید یه input داشته باشی که معمولا بصورت hidden هست و خودش بصورت اتومات وقتی فرم می خواد ارسال کنه یه مقدار csrf توکن داره که به سمت سرور می فرسته و سمت سرور هم خودش پشت صحنه این قضایا رو چک و هندل می کنه و اگر نزار همین خطایی رو می ده که الان می بینی. بهمین منظور باید تو فرمت هات اون input رو بزاری و موقع ارسال بصورت api هم اون csrf token رو باید با انگولار بخونی و اون رو هم باید تو هدر درخواستت به سمت سرور ارسال کنی.

کلا سوالت مشخص نیست! و من نفهمیدم مشکلت اینه که نمی دونی انگولار کار باید چی کار کنه یا خطا برای چیه یا اون کدت چرا اشتباهه.
ولی خارج از این سه حالتی که من بهت گفتم نیست و می تونی بر اساس مشکلت تو گوگل کد مورد نظرت رو پیدا کنی.


1masoud
تخصص : php,laravel
@masoudproton 6 سال پیش مطرح شد
1

@SeyedMH.Mosavi
الان نمیدونم مشکل از من هست یا از ui کار


سید محمد حسین موسوی
تخصص : FullStack Developer
@SeyedMH.Mosavi 6 سال پیش مطرح شد
1

خوب من تو توضیحات گفتم در صورتی که حالت اول و سوم باشه وظیفه کسی که داره انگولار کار می کنه و ایشون باید مشکل رو هندل کنه و اگر نمی دونه همین توضیحات رو بهش بده و خودش سرچ می کنه و مشکل رو حل می کنه ولی اگر حالت دوم باشه باشه و خطای access allow origin بده از سمت شماست.


1masoud
تخصص : php,laravel
@masoudproton 6 سال پیش مطرح شد
1

@SeyedMH.Mosavi

CSRF token not found این خطا که ربطی به access allow origin که نداره درسته یا نه؟
اینم آدرس ارور اگر inspect بگیرید یا f12 بزنید یک ارور داره
http://33830.ir/api/v1/tools12/showall


سید محمد حسین موسوی
تخصص : FullStack Developer
@SeyedMH.Mosavi 6 سال پیش آپدیت شد
1

نه ربطی نداره. کنسول رو نگاه کنی می بینی که خودش یه لینک داده و توضیح داده مشکل کجاست. یکم توجه کنی مشکلت حل می شه.

این لینک رو نگاه کن و توضیح بنده رو هم بخون. همون مورد سومیه که عرض کردم رو دوباره با دقت بخون و بعدش برو این لینکی که خودش تو متن خطا داره بهت نشون می ده رو هم نگاه کن و کدش رو تو پروژه ات استفاده کن
csrf


محمد امیر محمدی
تخصص : برنامه نویس لاراول و ویو جی اس
@mem.amir.m 6 سال پیش مطرح شد
1

باید مقدار accept : json/application رو در هدر ست کنه تا به api ها دسترسی داشته باشه.


1masoud
تخصص : php,laravel
@masoudproton 6 سال پیش مطرح شد
1

@mem.amir.m
@SeyedMH.Mosavi
من الان مشکل cors رو دارم باید چیکار کنم میگه اینا رو نصب کن Access-Control-Allow-Origin
در middleware هم یک فایل cors ساختم و این رو داخلش قرار دادم

  $headers = [
            "Access-Control-Allow-Origin" => "*,*",
            "Access-Control-Allow-Headers" => "Origin,Content-Type,Authorization,X-Auth-Token, Content-Type,Authorization",
             "Access-Control-Allow-Methods" => "GET,POST,PUT,PATCH,DELETE,HEAD,OPTIONS, GET, POST, PUT, PATCH, DELETE,OPTIONS",
        ];
        if ($request->getMethod() == 'OPTIONS') {
          return response('', 200, $headers);
        }
       $rr= $next($request);
        foreach ($headers as $k => $v) {
           $rr->headers->set($k, $v);
        }

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

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