Php 通过socket.io为广播频道授权laravel passport
我正在使用Php 通过socket.io为广播频道授权laravel passport,php,node.js,sockets,laravel-5,socket.io,Php,Node.js,Sockets,Laravel 5,Socket.io,我正在使用laravel 5.3+passport进行授权,laravel是我的后端API,它是restful 前端是用angular.js编写的,它通过rest请求与API进行通信 对于实时通知,我在angular.js中为套接字服务器和套接字客户端使用了laravel广播事件+redis,以及socket.io 我想授权这些活动,我已经尽我所能: 广播服务提供商: public function boot() { Broadcast::routes(['middleware' =>
laravel 5.3
+passport进行授权,laravel
是我的后端API,它是restful
前端是用angular.js
编写的,它通过rest请求与API进行通信
对于实时通知,我在angular.js中为套接字服务器和套接字客户端使用了laravel
广播事件+redis
,以及socket.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服务器的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);
});
问题是我不知道如何在socket server中验证这些广播事件,也不知道如何授权angular.js(SPA)
中的用户收听这些事件
我非常感谢您的帮助。我一定要看看
此模块提供钩子以在socket.io中实现身份验证
不使用querystring发送凭据,这不是一个好方法
安全实践
我最近采取的另一种方法是使用令牌()进行简单的基于令牌的身份验证
我不想在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方面,您需要一些,但是使用非常简单。比如:
<?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);
?>
$(文档).ready(函数(){
primus=primus.connect('ws://://\u admin');
primus.on('open',function(){
showConnected();
//发送订阅请求
write({action:'dashboard dump',token:'});
控制台写入(“连接到仪表板”);
});
您可以评估时间组件以避免重播攻击。无论如何,听起来这种方法可能满足您的需要
离题,但我也建议看一看。它充当“实时框架的通用包装器”。这使您能够以一种无需麻烦就可以交换套接字库的方式抽象内容。可能级别稍低一些(engine.IO)比您正在使用的要多。查看了socketio auth?上次我必须对socket服务器端进行身份验证时,我只是使用了我自己的基于令牌(HMAC)的东西。@ficuscr您能看一下吗:就授权而言,使用应用程序中已有的东西(laravel w/passport),如果未授权,不要提供token/ws URI?laravel确实支持私有通道,但我找不到任何关于从socket服务器授权到laravel的信息,今天我做了一些更改,我使用passport post请求授权我的angular应用程序,然后对于我需要实时通知的部分,我将访问令牌发送到socket服务器,从socket服务器发送到socket服务器cket服务器我将向其中一个用户路由发送get请求,以检查它是否已授权,如果已授权,则我授予它与客户端通信的权限,如果未授权,则关闭并断开套接字服务器
$(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.');
});