سلام آقای خسروجردی، خسته نباشید.
1 - آیا موقع register کردن کاربر باید توکن(passport یا sanctum) رو ایجاد کنیم(متد createToken) یا موقع login کردن کاربر؟
چون من داخل postman موقع register کردن کاربر توکن رو ایجاد کردم و در ویژوال استودیو کد در api.php middleware(auth:sanctum) هم به route->login دادم و داخل postman توکن ایجاد شده در درخواست register رو به Bearer Token در درخواست login دادم ولی به من error زیر رو داد.
2- آیا توکن تولید شده توسط passport و sanctum که بصورت hashed هست و ذخیره شده در دیتابیس رو میشه unhash کرد و به دستش آورد؟
سلام وقت بخیر
انتخابی شما هست
اگر میخوایید بعد از ثبت نام ، لاگین هم بشه باید توکن بدید بهش اگر میخوایید جدا لاگین کنه پس توکن ندید
چیزی که رمز نگاری میشه قابل بازگشت نییست مگر اینکه کلیدشو داشته باشید
ببخشید اگه میشه روی route login ، میدلور auth:api رو گذاشت و در متد register متد create token رو صدا زد؟
پس چرا در بالا که من درخواست login رو در postman صدا زدم و توکن رو هم بهش دادم به من اررور داده؟
متن خطا مشخصه
attempt رو از جای اشتباهی خوندید
attempt چیه و کجا باید بخونیمش؟
یک متد برای لاگین کردن کاربر
از روی facade auth
ببخشید آقای خسروجردی، چند تا سوال دیگه داشتم ممنون میشم جواب بدید:
1- ;()Passport::enableImplicitGrant چیکار میکنه؟
2. تفاوت توکن personal_access_client و password_client در جدول oauth_clients چیه و چجوری میشه این 2 تا توکن رو با استفاده از کد نویسی تولید کرد؟ چون تا اونجایی که میدونم متد createToken، توکنی که تولید میکنه از جنس personal_access_client هست.
3. چجوری میتونیم tokensExpireIn و refreshTokensExpireIn برای متد createToken تغییر بدیم؟ چون من که تست کردم وقتی توکن personal_access_client و password_client رو از طریق ترمینال vscode و postman ایجاد می کنیم، tokensExpireIn و refreshTokensExpireIn براش اعمال میشه ولی وقتی از طریق متد createtoken، توکن رو ایجاد می کنیم، tokensExpireIn و refreshTokensExpireIn براش اعمال نمیشه؟
4. آیا راهی برای بدست آوردن توکن وجود داره؟
Passport::enableImplicitGrantاین متد به شما اجازه میده تا امکانی برای "Implicit Grant" در OAuth2 اضافه کنید که معمولاً برای برنامههای سمت کلاینت مثل SPA ها استفاده میشود.
تفاوت در این است که personal_access_client برای توکنهای بدون نیاز به ورود مجدد استفاده میشود، در حالی که password_client برای احراز هویت با اعتبارنامه کاربر است. برای تولید توکن از هر دو میتوانید از createToken() با پارامترهای مختلف استفاده کنید.
برای تغییر مدت زمان انقضای توکنها باید از Passport::personalAccessTokensExpireIn() و Passport::refreshTokensExpireIn() استفاده کنید که در AuthServiceProvider تنظیم میشوند.
بله، میتوانید از طریق درخواستهای HTTP و استفاده از روشهای مناسب در OAuth2 توکن دریافت کنید، مثلا با استفاده از password grant.
1. مثلا چه امکانی رو اضافه میکنه میشه با مثال بزنید
2. منظورتون بدون نیاز به ورود مجدد و احراز هویت با اعتبارنامه کاربر چیه؟ میشه مثال بزنید چون تفاوتشون رو هنوز متوجه نشدم. من پارامترهای createToken رو نگاه کردم ولی پارامتری به نام نوع نداره که بشه personal یا password رو بهش بدی؟
3. Passport::refreshTokensExpireIn() برای تعیین مدت انقضای refreshToken هست پس برای password_client باید از چی استفاده کنیم
4. اینطوری کسی ممکنه این روش رو بلد باشه و توکن رو به دست بیاره و سایت یا اپلیکیشن موبایل رو هک کنه
اضافه کردن امکان با enableImplicitGrant
با استفاده از این متد، میتوانید "Implicit Grant" را فعال کنید. این روش معمولاً در برنامههای تک صفحهای (SPA) استفاده میشود، جایی که توکن مستقیماً به کلاینت ارسال میشود بدون نیاز به تبادل رمز عبور کاربر.
مثال: فرض کنید شما یک SPA دارید و نمیخواهید رمز عبور کاربر از طریق کلاینت ارسال شود. با استفاده از این امکان، کاربر به صفحه لاگین OAuth هدایت شده و پس از تأیید، توکن به کلاینت برمیگردد.
تفاوت personal_access_client و password_client:
personal_access_client: برای تولید توکنهایی استفاده میشود که نیاز به ورود مجدد کاربر ندارند. معمولاً برای دسترسی طولانیمدت یا APIهای بدون نیاز به احراز هویت مکرر استفاده میشود.
password_client: برای احراز هویت با استفاده از ایمیل و رمز عبور کاربر به کار میرود و معمولاً هنگام لاگین کاربر استفاده میشود.
مثال:
personal_access_client: کاربری یک API key برای دسترسی به دادههای خودش تولید میکند و میخواهد مدت طولانی بدون لاگین از آن استفاده کند.
password_client: برنامه موبایل کاربر لاگین میکند و توکن کوتاهمدت دریافت میکند.
درباره createToken: پارامتری برای تعیین نوع client وجود ندارد. نوع client از طریق تنظیمات کانفیگ و درخواست مشخص میشود.
تنظیم مدت انقضای توکن برای password_client:
از متد Passport::tokensExpireIn() برای تعیین مدت انقضای توکنهایی که توسط password_client صادر میشوند، استفاده کنید.
Passport::tokensExpireIn(now()->addHours(1)); // توکن یکساعته
امنیت روشهای OAuth:
اگر کسی به توکن دسترسی پیدا کند، میتواند از آن برای دسترسی به سیستم استفاده کند. برای افزایش امنیت:
استفاده از HTTPS: تمامی ارتباطات باید رمزنگاری شوند.
محدود کردن دسترسی توکن: از اسکوپهای محدود استفاده کنید تا هر توکن فقط به موارد ضروری دسترسی داشته باشد.
تنظیم مدت انقضا: توکنهای کوتاهمدت و استفاده از Refresh Token برای تمدید.
ردیابی توکنها: لاگهای استفاده از توکن را بررسی کنید و در صورت سوءاستفاده، آنها را لغو کنید.
IP Whitelist: دسترسی به APIها را به IPهای مشخص محدود کنید.
اضافه کردن امکان با enableImplicitGrant
یعنی در صفحه لاگین SPA، با فعال شدن این گزینه دیگه کاربر پسورد رو وارد نمیکنه و همین که توکن اون چک شد با میدلور auth:api میتونه با استفاده از توکن اش اگه درست باشه روی دکمه ورود که کلیک کرد به حساب کاربری و بقیه صفحات که نیاز به لاگین کردن کاربر داره دسترسی داشته باشه؟
در مورد personal_access_client و password_client:
اگه کاربرامون رو به دو دسته کاربران عادی و ادمین تقسیم کنیم. و برای کاربران عادی توکن personal و برای کاربران ادمین توکن password با زمان انقضای 1 ساعته، موقع لاگین برای هر دو تولید کنیم. و موقع لاگ اوت کردن کاربران عادی و ادمین، توکن هردوتاشون رو revoke کنیم و ازشون بگیریم. و موقع لاگین، دوباره براشون توکن جدید تولید کنیم. به نظرتون چطوره؟
اگه به نظرتون خوبه چند تا مشکل بازم داریم:
1. تولید توکن با تنظیم مدت انقضا: چطوری توکن personal و password تولید کنیم با زمان انقضای 1 ساعته چون createToken فقط توکن personal اون هم با زمان انقضای 1 ساله تولید میکنه؟ میشه نمونه کدش رو بگید.
2. Refresh Token: چطوری باید از Refresh Token برای تمدید استفاده کنیم.
3. ردیابی توکنها: آیا لاگ های توکن هم در مسیر storage/logs/laravel.log ذخیره می شوند؟
4. IPWhitelist: چجوری باید دسترسی به API ها رو به IP های مشخص محدود کنیم؟ آیا منظورتون API های نوشته شده در Controller ها هست یا route هایی که در مسیر routes/api.php نوشتیم؟
تولید توکن با زمان انقضا: با استفاده از Passport، میتوانید زمان انقضا را برای هر توکن جداگانه تنظیم کنید.
Refresh Token: با استفاده از grant_type: refresh_token میتوانید توکن را بدون لاگین مجدد تمدید کنید.
ردیابی توکنها: لاگهای توکن بهصورت پیشفرض در دیتابیس ذخیره میشوند (oauth_access_tokens). برای ردیابی بیشتر، رویدادهای Passport مانند TokenCreated را مانیتور کنید.
IP Whitelist: از Middleware برای چک کردن IP درخواستکننده استفاده کنید. این محدودیتها معمولاً روی routeهای routes/api.php اعمال میشوند.