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

- 3 ماه پیش
توسط 1masoud آپدیت شد
1masoud ( 23945 تجربه )
3 ماه پیش
تخصص : php,laravel

من با لاراول 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 ( 23945 تجربه )
3 ماه پیش
تخصص : php,laravel

@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 ( 103982 تجربه )
3 ماه پیش
تخصص : کانفیگ سرور و برنامه نویس

سلام
@masoudproton

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

1masoud ( 23945 تجربه )
3 ماه پیش
تخصص : php,laravel

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

سید محمد حسین موسوی ( 17513 تجربه )
3 ماه پیش
تخصص : FullStack Developer

توضیحاتت یکم گنگه اما اگر منظورت کلا اینه که چطوری طرف تو انگولار یا 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 ( 23945 تجربه )
3 ماه پیش
تخصص : php,laravel

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

سید محمد حسین موسوی ( 17513 تجربه )
3 ماه پیش
تخصص : FullStack Developer

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

1masoud ( 23945 تجربه )
3 ماه پیش
تخصص : php,laravel

@SeyedMH.Mosavi

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

سید محمد حسین موسوی ( 17513 تجربه )
3 ماه پیش
تخصص : FullStack Developer

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

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

محمد امیر محمدی ( 2473 تجربه )
3 ماه پیش
تخصص : برنامه نویس لاراول و ویو جی اس

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

1masoud ( 23945 تجربه )
3 ماه پیش
تخصص : php,laravel

@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);
        }
برای ارسال پاسخ باید وارد سایت شوید