وبلاگ

استفاده از کانال‌های خصوصی پوشر


رقیه اباذری رقیه اباذری

در این پست در مورد کانال‌های Pusher یاد می‌گیریم. بستری که به شما امکان می‌دهد تجربه بی‌وقفه و بی‌درنگ مورد نظر خود را به کاربران خود ارائه دهید.

کانال‌های خصوصی، اپلیکیشن‌های شما را برای انتشار پیام خصوصی امن در اختیار شما قرار می‌دهند. بهترین قسمت این است که پیاده‌سازی و استفاده از کانال‌های خصوصی برای اپلیکیشن آسان است. نحوه استفاده از آن‌ها را در این پست یاد خواهید گرفت.

راه اندازی سرور

حتی اگر این برنامه توسط لاراول طراحی شده باشد، باز هم از همان اصول برای رسیدگی به پیام‌‌های ما استفاده می‌شود. به جای یک فایل، اکنون یک ChannelsController برای رسیدگی به موارد کانال محور خود داریم و این کنترلر، یک متد sendMessage() دارد که درخواست‌های چت ورودی از مشتری را کنترل می‌کند. کد آن را می‌توانید در زیر مشاهده کنید:

public function sendMessage(Request $request) {
 
    if (!Auth::check()) {
 
        return new Response('Forbidden', 403);
 
    }
 
 
 
    $data = $request->json()->all();
 
 
 
    $data['user'] = Auth::user()->name;
 
 
 
    $this->pusher->trigger('anon-chat', 'send-message', $data);
 
}

من می خواهم از چت خود محافظت کنم تا فقط کاربران معتبر بتوانند به آن دسترسی پیدا کنند و شما می‌توانید در کد بالا ببینید که احرازهویت کاربر را قبل از شروع رویداد ارسال پیام بررسی می‌کند. این یک شروع خوب است، اما برای محافظت کامل از چت ما کافی نیست زیرا هرکسی که به کلید برنامه و اطلاعات کلاستر ما دسترسی داشته باشد می‌تواند به طور بالقوه مشترک شود و پیام‌های ارسالی از طریق کانال‌های عمومی برنامه ما را بشنود. برای محافظت کامل از چت خود، باید از یک کانال خصوصی برای ارسال پیام‌های خود استفاده کنیم و اولین قدم ایجاد یک کانال خصوصی است.

برای ایجاد یک کانال خصوصی، فقط یک رویداد را در یک کانال با پیشوند خصوصی فعال می‌کنیم. بنابراین می‌توانیم تماس قبلی را به trig() تغییر دهیم تا کد به شکل زیر تغییر یابد:

$this->pusher->trigger('private-chat', 'send-message', $data);

این کد اکنون پیام‌های ما را از طریق کانال چت خصوصی ارسال می‌کند و از دیدگاه سرور، این کد تنها چیزی است که سرور برای ارسال پیام از طریق یک کانال خصوصی به آن نیاز دارد. با این وجود مشتری‌ها برای عضویت در یک کانال خصوصی نیاز به احراز هویت دارند و این کار را با ارسال درخواست به یک اندپوینت تخصصی انجام می‌دهند.

نوشتن اندپوینت مجوز کلاینت

هنگامی که یک کتابخانه کلاینت سعی می‌کند در یک کانال خصوصی مشترک شود، درخواست POST را برای یک اندپوینت مجوز صادر می‌کند. این اندپوینت یک کار واحد دارد: تعیین اینکه آیا کاربر احراز هویت شده است یا خیر و یا با یک پاسخ مناسب پاسخ می‌دهد. یک متد جدید به نام autorizeUser() این درخواست را کنترل می‌کند و کد آن بسیار ساده است.

public function authorizeUser(Request $request) {
 
    if (!Auth::check()) {
 
        return new Response('Forbidden', 403);
 
    }
 
 
 
    echo $this->pusher->socket_auth(
 
        $request->input('channel_name'), 
 
        $request->input('socket_id')
 
    );
 
}

ابتدا وضعیت احراز هویت کاربر را بررسی می‌کند و در صورت عدم ورود به سیستم با 403 ممنوع پاسخ می‌دهد. اما اگر بررسی تأیید کاربر از آن عبور کند، روش autorizeUser() نیاز به یک مقدار خاص در خروجی دارد که از دو مقدار از تشکیل شده که در بدنه ریکوئست ارسال شده‌اند، هانطور که در کد بالا نشان داده شده است، خروجی توسط متد socket_auth() کتابخانه Pusher تولید می‌شود. اگر خروجی حاصل با مقدار مورد انتظار کتابخانه کلاینت مطابقت داشته باشد، مشتری تأیید اعتبار می‌شود و می‌تواند در کانال خصوصی مشترک شود.

خوشبختانه، کل این فرآیند خودکار است. ما فقط باید کلاینت را پیکربندی کنیم تا درخواست‌های مجوز را به این اندپوینت ارسال کند.

کانفیگ کلاینت

هنگامی که یک آبجکت pusher را برای لایبرری کلاینت ایجاد کردید، می‌توانید ریزالت آبجکت را برای ارسال ریکوئست احرازهویت برای یک اندپوینت خاص کانفیگ کنید. همانطور که در شکل زیر مشاهده می‌کنید، براحتی یک آبجکت authEndpoint را افزوده و URL اندپوینت را برای آن ست کنید:

let pusher = new Pusher('427017da1bd2036904f3', {
 
    authEndpoint: '/channels/authorize',
 
    cluster: 'us2',
 
    encrypted: true,
 
    auth: {
 
        headers: {
 
            'X-CSRF-Token': this.csrfToken
 
        }
 
    }
 
});
 
 
 
let channel = pusher.subscribe('private-chat');

همچنین می‌توانید آپشن auth را برای هدرهای احراز هویت ست کنید. این کد، هدر X-CSRF-Token را برای جلوگیری از حملات CSRF ست می‌کند.

حالا، هنگامی که کلاینت سعی در سابسکرایب کردن یک کانال پرایوت داشته باشد، کلاینت با استفاده از URLهای اندپوینت ارائه شده احرازهویت شده و دسترسی به کانال مبتنی بر ریسپانس پذیرفته یا رد خواهد شد.

نتیجه‌گیری

با استفاده از کانال‌های پرایوت، امنیت اپلیکیشن شما به طور چشمگیری افزایش می‌یابد و پیکربندی اپلیکیشن‌های‌تان برای استفاده از آنها راحت است. با استفاده از کانال‌های پوشر، افزودن ارتباطات بلادرنگ (real-time) امن در اپلیکیشن‌هایتان فوق العاده امن می‌شود، ضمن اینکه به کد زیادی نیاز ندارد.


رقیه اباذری
رقیه اباذری

تو دانشگاه IT خوندم و اکثر منابع کتاب‌های ترجمه شده بودند و صدالبته مبهم :( مثلا element رو "عنصر" ترجمه می‌کردن و من همیشه می‌رفتم تو شیمی و جدول مندلیف. تو باورژن سعی کردم تا حد ممکن مطالب رو با زبان ساده و قابل درک بنویسم. باشد که کسانی که تازه پا به عرصه برنامه‌نویسی گذاشتن، راغب‌تر بشن و با نظرات و فیدبک‌های شما راه هموارتر بشه:)

مطالب مرتبط

دیدگاه‌ها