gpt4 book ai didi

php - 通过socket.io为广播 channel 授权laravel通行证

转载 作者:太空宇宙 更新时间:2023-11-03 22:08:12 24 4
gpt4 key购买 nike

我正在使用laravel 5.3 + 授权护照,Laravel是我的后端 API,即 restful .

前端写在 angular.js它通过剩余请求与 API 进行通信。

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

我想授权这些事件,并且我已经尽力了:

广播服务提供商:

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 .

This module provides hooks to implement authentication in socket.io without using querystrings to send credentials, which is not a good security practice.

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

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

你的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)要低一些。

关于php - 通过socket.io为广播 channel 授权laravel通行证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50097507/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com