socketio-jwt:连接到SocketIO,进行身份验证

时间:2017-03-09 15:56:23

标签: javascript php node.js laravel socket.io

我已经按照多个教程来设置Connected to SocketIO, Authenticating,但每次看起来我都没有超越这一部分:

<h1>Socket Connection Status: <span id="connection"></span></h1> <script type="text/javascript"> $(document).ready(function () { socketIOConnectionUpdate('Requesting JWT Token from Laravel'); $.ajax({ url: 'http://localhost:8000/token?id=1' }) .fail(function (jqXHR, textStatus, errorThrown) { socketIOConnectionUpdate('Something is wrong on ajax: ' + textStatus); }) .done(function (result, textStatus, jqXHR) { socketIOConnectionUpdate('Connected to SocketIO, Authenticating') /* make connection with localhost 3000 */ var token = result.token; var socket = io.connect('http://localhost:3000'); socket.on('connect', function () { socket .emit('authenticate', {token: token}) //send the jwt .on('authenticated', function () { console.log('authenticated'); socketIOConnectionUpdate('Authenticated'); }) .on('unauthorized', function(msg) { socketIOConnectionUpdate('Unauthorized, error msg: ' + msg.message); throw new Error(msg.data.type); }) }); }); }); /* Function for print connection message */ function socketIOConnectionUpdate(str) { $('#connection').html(str); }

有什么想法吗?

客户端:

var express = require('express');
var app = express();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var socketioJwt = require('socketio-jwt');
var dotenv = require('dotenv').config({path:'../.env'});

var port = 3000;

io
    .on('connection', socketioJwt.authorize({
        secret: dotenv.JWT_SECRET,
        timeout: 100 // 15 seconds to send the authentication message
    }))
    .on('authenticated', function(socket){
        console.log('connected & authenticated: ' + JSON.stringify(socket.decoded_token));
        socket.on('chat message', function(msg){
            debugger;
            io.emit('chat message', msg);
        });
    });

http.listen(port, function(){
  console.log('listening on *:' + port);
});

服务器端

<p>Hello <span class="superitalic">SUPERITALIC!</span> World!</p>

1 个答案:

答案 0 :(得分:0)

您可能误解了dotenv的工作原理,因为您正在尝试使用它的返回值。

  

Dotenv是一个零依赖模块,它将环境变量从.env文件加载到process.env。

来自:dotenv github

相反,它将存储在位于../.env的文件中的变量导出为环境变量,这些变量可作为process.env的一部分使用。

所以不要这样:

var dotenv = require('dotenv').config({path:'../.env'});
socketioJwt.authorize({
  secret: dotenv.JWT_SECRET,
  timeout: 100
})

这样做

// do this near the entry point to your application!!
require('dotenv').config({path:'../.env'});

socketioJwt.authorize({
  secret: process.env.JWT_SECRET,
  timeout: 100
})
相关问题