在本系列中,我们一直在学习Pusher中的Channels ,该平台可让您为用户提供所需的无缝实时体验。
专用通道为您的应用程序提供了一种安全的专用媒体来发布消息。 最好的部分是为您的应用程序实现和使用私有渠道有多么容易。 您将在本文中学习如何使用它们。
更好的聊天应用
在上一个视频中,我们看了一个非常简单的聊天应用程序,它没有用户,也没有安全性。 这只是匿名聊天。 它有效,请不要误会我,但我们可以做得更好! 因此,在此视频中,我们将介绍该聊天应用程序的一个稍有不同的版本。 前端基本相同,但后端是Laravel应用程序。
设置服务器
即使该应用程序由Laravel驱动,也使用相同的原理来处理我们的消息。 现在,我们有了一个ChannelsController
来处理面向Channels的内容,而不是单个文件,并且它具有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);}
我想保护我们的聊天,以便只有经过身份验证的用户才能访问它,并且您可以在上面的代码中看到它在触发send-message
事件之前检查用户是否经过身份验证。 这是一个很好的开始,但还不足以完全保护我们的聊天,因为任何有权访问我们的应用程序密钥和群集信息的人都可以订阅并收听通过我们应用程序的公共渠道发送的任何消息。 为了完全保护我们的聊天,我们需要使用专用通道发送消息,第一步是创建一个专用通道。
要创建一个专用通道,我们只需用一个通道上触发事件private-
前缀。 因此,我们可以将对trigger()
的先前调用更改为以下代码:
$this->pusher->trigger('private-chat', 'send-message', $data);
现在,此代码将通过private-chat
通道发送消息,从服务器的角度来看,这是服务器通过专用通道发送消息的唯一要求。 但是,客户端需要进行身份验证才能订阅专用通道,并且通过向专用终结点发送请求来进行认证。
编写客户端授权端点
当客户端库尝试订阅专用通道时,它将向授权端点发出POST请求。 该端点只有一项工作:确定用户是否已通过身份验证并以适当的响应进行响应。 一个名为authorizeUser()
新方法将处理此请求,其代码非常简单。
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 Forbidden进行响应。但是,如果通过了用户的auth检查, authorizeUser()
方法需要输出一个特殊值,该特殊值从请求的两个值派生而来。身体。
输出由Pusher库的socket_auth()
方法生成,如上面的代码所示。 如果结果输出与客户端库期望的值匹配,则客户端将通过身份验证并可以订阅专用通道。
幸运的是,整个过程是自动化的。 我们只需要配置客户端以将授权请求发送到此端点。
配置客户端
为客户端库创建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
标头,以防止跨站点请求伪造攻击。
现在,当客户端尝试订阅专用频道时,它将使用提供的端点URL进行身份验证,并根据响应允许或拒绝对频道的访问。
结论
使用专用通道可以极大地提高应用程序的安全性,并且轻松配置应用程序以使用它们。 使用Pusher的Channels ,可以非常轻松地为您的应用程序添加安全的实时通信,甚至不需要很多代码!
翻译自: https://code.tutsplus.com/tutorials/get-started-with-pusher-using-private-channels--cms-31253