Skip to content

Commit 95517bb

Browse files
committed
websocket 通信用户认证逻辑优化
1 parent 8434526 commit 95517bb

File tree

8 files changed

+27
-23
lines changed

8 files changed

+27
-23
lines changed

app/Http/Controllers/SocketIOController.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ class SocketIOController extends Controller
88
{
99
protected $transports = ['polling', 'websocket'];
1010

11+
public function __construct()
12+
{
13+
$this->middleware('auth:api');
14+
}
15+
1116
public function upgrade(Request $request)
1217
{
1318
if (! in_array($request->input('transport'), $this->transports)) {

app/Http/Middleware/Authenticate.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace App\Http\Middleware;
44

5+
use Illuminate\Auth\Access\AuthorizationException;
56
use Illuminate\Auth\Middleware\Authenticate as Middleware;
67

78
class Authenticate extends Middleware
@@ -15,7 +16,7 @@ class Authenticate extends Middleware
1516
protected function redirectTo($request)
1617
{
1718
if (! $request->expectsJson()) {
18-
return route('login');
19+
throw new AuthorizationException("登录后才能建立 Websocket 连接");
1920
}
2021
}
2122
}

public/js/app.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51310,7 +51310,6 @@ _socket__WEBPACK_IMPORTED_MODULE_5__["default"].on('disconnect', function () {
5131051310
});
5131151311
_socket__WEBPACK_IMPORTED_MODULE_5__["default"].on('message', function (obj) {
5131251312
_store__WEBPACK_IMPORTED_MODULE_4__["default"].commit('addRoomDetailInfos', [obj]);
51313-
console.log(Notification.permission);
5131451313

5131551314
if (Notification.permission === "granted") {
5131651315
popNotice(obj);
@@ -53028,9 +53027,12 @@ router.afterEach(function (route) {
5302853027
__webpack_require__.r(__webpack_exports__);
5302953028
/* harmony import */ var socket_io_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! socket.io-client */ "./node_modules/socket.io-client/lib/index.js");
5303053029
/* harmony import */ var socket_io_client__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(socket_io_client__WEBPACK_IMPORTED_MODULE_0__);
53030+
/* harmony import */ var _store__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./store */ "./resources/js/store/index.js");
5303153031
// 通过 Socket.io 客户端发起 WebSocket 请求
5303253032

53033-
var socket = socket_io_client__WEBPACK_IMPORTED_MODULE_0___default()('http://webchats.test');
53033+
53034+
var api_token = _store__WEBPACK_IMPORTED_MODULE_1__["default"].state.userInfo.token;
53035+
var socket = socket_io_client__WEBPACK_IMPORTED_MODULE_0___default()('http://webchats.test?api_token=' + api_token);
5303453036
/* harmony default export */ __webpack_exports__["default"] = (socket);
5303553037

5303653038
/***/ }),

readme.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,6 @@
1414
- [十二、加入和退出聊天室房间功能实现](https://xueyuanjun.com/post/21337)
1515
- [十三、发送文本/表情消息](https://xueyuanjun.com/post/21351)
1616
- [十四、发送图片消息](https://xueyuanjun.com/post/21360)
17-
- 十五、代码优化
18-
- 十六、性能优化
17+
- [十五、用户头像上传](https://xueyuanjun.com/post/21373)
18+
- [十六、通过心跳连接替换轮询保持长连接](https://xueyuanjun.com/post/21412)
19+
- [十七、Websocket 通信用户认证逻辑优化](https://xueyuanjun.com/post/21413)

resources/js/app.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import router from './router'; // router
99
import store from './store'; // store
1010
import socket from './socket';
1111
import {queryString} from './utils/queryString';
12-
1312
import MuseUI from 'muse-ui'; // muse-ui组件
1413
Vue.use(MuseUI);
1514

@@ -77,7 +76,6 @@ socket.on('disconnect', () => {
7776

7877
socket.on('message', function (obj) {
7978
store.commit('addRoomDetailInfos', [obj]);
80-
console.log(Notification.permission);
8179
if (Notification.permission === "granted") {
8280
popNotice(obj);
8381
} else if (Notification.permission !== "denied") {

resources/js/socket.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
// 通过 Socket.io 客户端发起 WebSocket 请求
22
import io from 'socket.io-client';
3-
const socket = io('http://webchats.test');
3+
import store from "./store";
4+
let api_token = store.state.userInfo.token;
5+
const socket = io('http://webchats.test?api_token=' + api_token);
46
export default socket;

routes/web.php

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,5 @@
1515
return view('index');
1616
});
1717

18-
Route::get('/test', function () {
19-
return 'hello world!';
20-
});
21-
2218
Route::get('/socket.io', 'SocketIOController@upgrade');
2319
Route::post('/socket.io', 'SocketIOController@ok');
24-
25-
Route::get('download', function() {
26-
return response()->streamDownload(function(){
27-
echo file_get_contents('https://github.com/nonfu/laravel-resources/raw/master/pkgs/laravel58.zip');
28-
}, 'laravel58.zip');
29-
});

routes/websocket.php

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
<?php
2-
32
use App\Count;
43
use App\User;
54
use App\Message;
@@ -23,10 +22,12 @@
2322
WebsocketProxy::on('connect', function (WebSocket $websocket, Request $request) {
2423
// 发送欢迎信息
2524
$websocket->setSender($request->fd);
25+
$websocket->loginUsing(auth('api')->user());
2626
});
2727

2828
WebsocketProxy::on('room', function (WebSocket $websocket, $data) {
29-
if (!empty($data['api_token']) && ($user = User::where('api_token', $data['api_token'])->first())) {
29+
if ($userId = $websocket->getUserId()) {
30+
$user = User::find($userId);
3031
// 从请求数据中获取房间ID
3132
if (empty($data['roomid'])) {
3233
return;
@@ -64,7 +65,8 @@
6465
});
6566

6667
WebsocketProxy::on('message', function (WebSocket $websocket, $data) {
67-
if (!empty($data['api_token']) && ($user = User::where('api_token', $data['api_token'])->first())) {
68+
if ($userId = $websocket->getUserId()) {
69+
$user = User::find($userId);
6870
// 获取消息内容
6971
$msg = $data['msg'];
7072
$img = $data['img'];
@@ -129,10 +131,12 @@
129131

130132
WebsocketProxy::on('disconnect', function (WebSocket $websocket, $data) {
131133
roomout($websocket, $data);
134+
$websocket->logout();
132135
});
133136

134137
function roomout(WebSocket $websocket, $data) {
135-
if (!empty($data['api_token']) && ($user = User::where('api_token', $data['api_token'])->first())) {
138+
if ($userId = $websocket->getUserId()) {
139+
$user = User::find($userId);
136140
if (empty($data['roomid'])) {
137141
return;
138142
}
@@ -154,7 +158,8 @@ function roomout(WebSocket $websocket, $data) {
154158
}
155159

156160
WebsocketProxy::on('login', function (WebSocket $websocket, $data) {
157-
if (!empty($data['api_token']) && ($user = User::where('api_token', $data['api_token'])->first())) {
161+
if ($userId = $websocket->getUserId()) {
162+
$user = User::find($userId);
158163
// 将用户与指定fd连接关联起来保存到Redis中
159164
Redis::hset('socket_id', $user->id, $websocket->getSender());
160165
// 获取未读消息

0 commit comments

Comments
 (0)