【问题标题】:Authorization for laravel passport through socket.io for broadcasting channels通过 socket.io 为广播频道授权 laravel 护照
【发布时间】:2018-10-10 08:54:54
【问题描述】:

我使用laravel 5.3 + 护照进行授权,Laravel 是我的后端API,即restful

前端是用angular.js 编写的,它通过休息请求与API 通信。

对于实时通知,我在angular.js. 中使用laravel 广播事件+redissocket.io 用于套接字服务器和套接字客户端

我想授权这些活动,我已经尽力做到了:

广播服务提供者:

public function boot()
{
   Broadcast::routes(['middleware' => ['auth:api']]);
   Broadcast::channel('App.User.*', function ($user, $userId) 
   {
     return (int) $user->id === (int) $userId;
   });

   Broadcast::channel('notifs.*', function ($user, $userId) {
     return $user->id === (int) $userId;
   });
}

这是运行我的套接字服务器的 socket.js 代码:

var app   = require('express')();
var http  = require('http').Server(app);
var io    = require('socket.io')(http);
var Redis = require('ioredis');
var redis = new Redis();

redis.psubscribe('*', function(err, count) {});

redis.on('pmessage', function(subscribed, channel, message) {
    console.log(channel);
    message = JSON.parse(message);
    io.emit(channel + ':' + message.event, message.data);
});

http.listen(3000, function () {
    console.log('Listening on Port 3000');
});

redis.on("error", function (err) {
    console.log(err);
});

问题是我不知道如何在套接字服务器中验证这些广播事件,也不知道如何授权angular.js (SPA) 中的用户收听这些事件。

我将不胜感激。

【问题讨论】:

  • 看过socketio-auth?上次我必须对套接字服务器端进行身份验证时,我只是推出了我自己的基于令牌 (HMAC) 的东西。
  • @ficuscr 可以看看吗:stackoverflow.com/questions/50187836/…

标签: php node.js sockets laravel-5 socket.io


【解决方案1】:

我一定会看看socketio-auth

这个模块提供了在socket.io中实现认证的钩子 不使用查询字符串发送凭据,这不是一个好方法 安全实践。

我最近采用的另一种方法是使用 JWT 令牌 (njwt) 进行简单的基于令牌的身份验证。

我不想在 Node.js 中重新创建检查用户凭据的身份验证代码。 (在我的情况下,它甚至无法连接到数据库)。相反,我会让使用套接字的 PHP 应用程序利用其已经建立的身份验证系统。使用套接字连接请求传递签名令牌。

您的 node.JS 代码可能类似于...

primus.on('connection', function (spark) {

    logger.debug('primus event connection.  spark id: ' + spark.id);

    spark.on('data', function(data) {

        var action = data.action;

        njwt.verify(data.token, JWT_SECRET, function(err, verifiedJwt) {
            if (err) {
                logger.warn('Bad JWT Token! ' + spark.id + ' Error: ' + err);
                spark.user = {id:null, is_authed: false, is_admin: false, application_ini: null};
                spark.end('Bad Token Request');
                return; //->
            }

            spark.user = {  'id': verifiedJwt.body['user_id'],
                            'is_authed': verifiedJwt.body['is_authed'],
                            'application_ini': verifiedJwt.body['application_ini'],
                            'is_admin': verifiedJwt.body['is_admin']};

            sockoasRooms.connect(spark.id, spark.user.application_ini, spark.user.id); 


            switch (action) {
            ...

然后在 PHP 端,您需要一些 code for generating the JWT tokens,但使用非常简单。比如:

<?php
$tokenPayload = [   'user_id'           => ($this->currentUser) ? $this->currentUser->getId() : 0,
                    'is_authed'         => ($this->currentUser) ? true : false,
                    'application_ini'   => (string) APPLICATION_INI,
                    'is_admin'          => (bool) ($this->currentUser) ? $this->currentUser->isAdministrator() : false,
                    'now'               => time()
];
$jwtToken = \OAS_JWT::encode($tokenPayload, SOCK_OAS_JWT_KEY);

?>

$(document).ready(function() {

    primus = Primus.connect('ws://<?=SOCK_OAS_IP?>:<?=SOCK_OAS_PORT?>/_admin');

    primus.on('open', function () {
        showConnected();
        // Send request to subscribe
        primus.write({action: 'dashboard-dump', token: '<?=$jwtToken?>'});
        consoleWrite('Connected to dashboard.');
    });

您可以评估时间组件以避免重放攻击。无论如何,听起来这种方法可能会满足您的需求。

题外话,但我也建议看看primus。它充当“实时框架的通用包装器”。这使您可以以某种方式抽象事物,以便您可以毫不费力地更换套接字库。可能比您使用的级别低一点(engine.IO)。

【讨论】:

  • 就授权而言,使用你在应用程序中已有的(laravel w/passport),如果没有授权,不要给token/ws URI?
  • laravel 确实支持私人频道,但我找不到任何关于从套接字服务器授权到 laravel 的信息,今天我做了一些更改,我通过护照发布请求授权我的角度应用程序,然后对于我需要真实的部分时间通知我将访问令牌发送到套接字服务器
  • 我将从套接字服务器向其中一个用户路由发送一个 get 请求以检查它是否被授权,如果它被授权,那么我授予它与客户端通信的权限,如果不是我关闭并断开连接套接字服务器
猜你喜欢
  • 1970-01-01
  • 2019-08-28
  • 2018-03-03
  • 2018-09-26
  • 2017-12-22
  • 2017-10-03
  • 2018-02-19
  • 1970-01-01
  • 2021-11-08
相关资源
最近更新 更多