私有通道为您的应用程序提供了一个安全的私有媒体来发布消息。最好的部分是为您的应用程序实施和使用私有渠道是多么容易。您将在这篇文章中学习如何使用它们。
更好的聊天应用
在之前的视频中,我们看了一个非常简单的聊天应用程序,它没有用户,也没有安全性;这只是匿名聊天。它有效,不要误会我的意思,但我们可以做得更好!因此,在本视频中,我们将了解该聊天应用程序的一个稍微不同的版本。前端大致相同,但后端是 Laravel 应用程序。
设置服务器
尽管该应用程序由 Laravel 提供支持,但我们使用相同的原则来处理我们的消息。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); }
我想保护我们的聊天,以便只有经过身份验证的用户才能访问它,您可以在上面的代码中看到它在触发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 响应。但如果用户的身份验证检查通过,该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 ,为您的应用程序添加安全的实时通信非常容易,甚至不需要大量代码!
- 编写客户端授权端点