Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Anonymous Authentication fails over Socket.io #457

Closed
mmucklo opened this Issue Mar 22, 2017 · 13 comments

Comments

Projects
None yet
4 participants
@mmucklo
Copy link

mmucklo commented Mar 22, 2017

Anonymous authentication via JWT works over REST, but not over socket IO.

This is a follow-on from the discussion on issue #423

The approach that presently works is as follows:

  1. Authenticate first with REST
  2. (automatic: store token in localStorage)
  3. Authenticate using stored token on socket.io
  4. Then process socket.io request.

It would be nice to get e2e anonymous authentication working with socket.io as well, however.

More details of the results I'm seeing are in the original issue.

@daffl asked me to open a new issue about this - it also may be related to #455

@mmucklo

This comment has been minimized.

Copy link
Author

mmucklo commented Mar 22, 2017

Note, this is using the 1.0 (master) branch

@ekryski

This comment has been minimized.

Copy link
Member

ekryski commented Mar 23, 2017

We resolved #455. Would you mind trying out master @mmucklo to see if this is still happening (ie. can you authenticate with an anonymous JWT over sockets)?

Note: you'll now need to make sure you are passing a strategy (likely strategy: 'jwt') from your client when try to authenticate. The auth client will do this for you already but if you weren't using that you may need to change your code.

@miguelpeixe

This comment has been minimized.

Copy link

miguelpeixe commented Jul 6, 2017

I just created an anonymous strategy using passport-anonymous and apparently socket is not being updated (or firing the appropriate hook) to send auth headers. Even though the jwt is returned, stored on localStorage and verified it can only send the headers if I reload the page, which recycles the stored jwt.

@miguelpeixe

This comment has been minimized.

Copy link

miguelpeixe commented Jul 6, 2017

REST works, btw

@ekryski

This comment has been minimized.

Copy link
Member

ekryski commented Jul 24, 2017

@miguelpeixe the socket headers will only be sent when the socket connects (or re-connects) so it makes sense that you're not seeing them until you reload the page.

When you authenticate anonymously, are you saying that your socket is still not actually authenticated? Issue #455 was related to hooks not being fired at all if you didn't authenticate correctly over sockets.

Can you clarify what you were expecting to happen and what isn't happen? I'm trying to figure out if this is the same issue or a different one. 🍻

@miguelpeixe

This comment has been minimized.

Copy link

miguelpeixe commented Jul 26, 2017

@ekryski you are right, I had to client.io.disconnect() and client.io.connect() to make my single-page app perform the proper first-time anon auth.

@mmucklo

This comment has been minimized.

Copy link
Author

mmucklo commented Nov 17, 2017

So I've upgraded to buzzard (@feathersjs 3.0) and now I have a new problem.

My auth is no longer sticking...

Basically whether I authenticate with strategy: jwt (which works now) over socket.io or authenticate afterwards, the subsequent call I make thinks that the connection is "NotAuthorized".

REST, of course is working fine...

The sequence looks like this:

screen shot 2017-11-16 at 8 49 32 pm

@mmucklo

This comment has been minimized.

Copy link
Author

mmucklo commented Nov 17, 2017

Further details the server looks like this:

I've separated the two calls:

api_1           | Fri, 17 Nov 2017 05:52:17 GMT engine:ws received "422["authenticate",{"strategy":"jwt","accessToken":"eyJhbGciOiJIUzI1NiIsInR5cCI6ImFjY2VzcyJ9.eyJpYXQiOjE1MTA4OTc5MjUsImV4cCI6MTUxMDk4NDMyNSwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDozMDAwIiwiaXNzIjoiZmVhdGhlcnMiLCJzdWIiOiJhbm9ueW1vdXMiLCJqdGkiOiJiZmQ4ZjU4ZS0wMmNmLTQ4ZmYtYTdjZi00MDgyZDE3OWQ3MTUifQ.czTCrpSVkIeTXoqKTJF_UoSkGaftXLLPLhWrZVHpCTU"}]"
api_1           | Fri, 17 Nov 2017 05:52:17 GMT engine:socket packet
api_1           | Fri, 17 Nov 2017 05:52:17 GMT socket.io-parser decoded 22["authenticate",{"strategy":"jwt","accessToken":"eyJhbGciOiJIUzI1NiIsInR5cCI6ImFjY2VzcyJ9.eyJpYXQiOjE1MTA4OTc5MjUsImV4cCI6MTUxMDk4NDMyNSwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDozMDAwIiwiaXNzIjoiZmVhdGhlcnMiLCJzdWIiOiJhbm9ueW1vdXMiLCJqdGkiOiJiZmQ4ZjU4ZS0wMmNmLTQ4ZmYtYTdjZi00MDgyZDE3OWQ3MTUifQ.czTCrpSVkIeTXoqKTJF_UoSkGaftXLLPLhWrZVHpCTU"}] as {"type":2,"nsp":"/","id":2,"data":["authenticate",{"strategy":"jwt","accessToken":"eyJhbGciOiJIUzI1NiIsInR5cCI6ImFjY2VzcyJ9.eyJpYXQiOjE1MTA4OTc5MjUsImV4cCI6MTUxMDk4NDMyNSwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDozMDAwIiwiaXNzIjoiZmVhdGhlcnMiLCJzdWIiOiJhbm9ueW1vdXMiLCJqdGkiOiJiZmQ4ZjU4ZS0wMmNmLTQ4ZmYtYTdjZi00MDgyZDE3OWQ3MTUifQ.czTCrpSVkIeTXoqKTJF_UoSkGaftXLLPLhWrZVHpCTU"}]}
api_1           | Fri, 17 Nov 2017 05:52:17 GMT socket.io:socket got packet {"type":2,"nsp":"/","id":2,"data":["authenticate",{"strategy":"jwt","accessToken":"eyJhbGciOiJIUzI1NiIsInR5cCI6ImFjY2VzcyJ9.eyJpYXQiOjE1MTA4OTc5MjUsImV4cCI6MTUxMDk4NDMyNSwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDozMDAwIiwiaXNzIjoiZmVhdGhlcnMiLCJzdWIiOiJhbm9ueW1vdXMiLCJqdGkiOiJiZmQ4ZjU4ZS0wMmNmLTQ4ZmYtYTdjZi00MDgyZDE3OWQ3MTUifQ.czTCrpSVkIeTXoqKTJF_UoSkGaftXLLPLhWrZVHpCTU"}]}
api_1           | Fri, 17 Nov 2017 05:52:17 GMT socket.io:socket emitting event ["authenticate",{"strategy":"jwt","accessToken":"eyJhbGciOiJIUzI1NiIsInR5cCI6ImFjY2VzcyJ9.eyJpYXQiOjE1MTA4OTc5MjUsImV4cCI6MTUxMDk4NDMyNSwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDozMDAwIiwiaXNzIjoiZmVhdGhlcnMiLCJzdWIiOiJhbm9ueW1vdXMiLCJqdGkiOiJiZmQ4ZjU4ZS0wMmNmLTQ4ZmYtYTdjZi00MDgyZDE3OWQ3MTUifQ.czTCrpSVkIeTXoqKTJF_UoSkGaftXLLPLhWrZVHpCTU"}]
api_1           | Fri, 17 Nov 2017 05:52:17 GMT socket.io:socket attaching ack callback to event
api_1           | Fri, 17 Nov 2017 05:52:17 GMT socket.io:socket dispatching an event ["authenticate",{"strategy":"jwt","accessToken":"eyJhbGciOiJIUzI1NiIsInR5cCI6ImFjY2VzcyJ9.eyJpYXQiOjE1MTA4OTc5MjUsImV4cCI6MTUxMDk4NDMyNSwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDozMDAwIiwiaXNzIjoiZmVhdGhlcnMiLCJzdWIiOiJhbm9ueW1vdXMiLCJqdGkiOiJiZmQ4ZjU4ZS0wMmNmLTQ4ZmYtYTdjZi00MDgyZDE3OWQ3MTUifQ.czTCrpSVkIeTXoqKTJF_UoSkGaftXLLPLhWrZVHpCTU"},null]
api_1           | 2017-11-17T05:52:17.984Z @feathersjs/authentication:authentication:utils Creating JWT using options { header: { typ: 'access' },
api_1           |   audience: 'http://localhost:3000',
api_1           |   subject: 'anonymous',
api_1           |   issuer: 'feathers',
api_1           |   algorithm: 'HS256',
api_1           |   expiresIn: '1d',
api_1           |   jwtid: '116e9837-ac4a-49c0-ad4a-b51c9fa4e6ca' }
api_1           | 2017-11-17T05:52:17.985Z @feathersjs/authentication:authentication:utils New JWT issued with payload {}
api_1           | info: after: authentication - Method: create
api_1           | 2017-11-17T05:52:17.986Z @feathersjs/socket-commons/channels Publishing event created authentication
api_1           | 2017-11-17T05:52:17.987Z @feathersjs/socket-commons/channels No connections to publish to
api_1           | 2017-11-17T05:52:17.987Z @feathersjs/authentication:sockets:handler Clearing old timeout.
api_1           | Fri, 17 Nov 2017 05:52:17 GMT socket.io:socket sending ack [null,{"accessToken":"eyJhbGciOiJIUzI1NiIsInR5cCI6ImFjY2VzcyJ9.eyJpYXQiOjE1MTA4OTc5MzcsImV4cCI6MTUxMDk4NDMzNywiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDozMDAwIiwiaXNzIjoiZmVhdGhlcnMiLCJzdWIiOiJhbm9ueW1vdXMiLCJqdGkiOiIxMTZlOTgzNy1hYzRhLTQ5YzAtYWQ0YS1iNTFjOWZhNGU2Y2EifQ.i8jZFxNKYGDqLrwSxRO_N-XCniznusy7IKxicunoRfQ"}]
api_1           | Fri, 17 Nov 2017 05:52:17 GMT socket.io:client writing packet {"id":2,"type":3,"data":[null,{"accessToken":"eyJhbGciOiJIUzI1NiIsInR5cCI6ImFjY2VzcyJ9.eyJpYXQiOjE1MTA4OTc5MzcsImV4cCI6MTUxMDk4NDMzNywiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDozMDAwIiwiaXNzIjoiZmVhdGhlcnMiLCJzdWIiOiJhbm9ueW1vdXMiLCJqdGkiOiIxMTZlOTgzNy1hYzRhLTQ5YzAtYWQ0YS1iNTFjOWZhNGU2Y2EifQ.i8jZFxNKYGDqLrwSxRO_N-XCniznusy7IKxicunoRfQ"}],"nsp":"/"}
api_1           | Fri, 17 Nov 2017 05:52:17 GMT socket.io-parser encoding packet {"id":2,"type":3,"data":[null,{"accessToken":"eyJhbGciOiJIUzI1NiIsInR5cCI6ImFjY2VzcyJ9.eyJpYXQiOjE1MTA4OTc5MzcsImV4cCI6MTUxMDk4NDMzNywiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDozMDAwIiwiaXNzIjoiZmVhdGhlcnMiLCJzdWIiOiJhbm9ueW1vdXMiLCJqdGkiOiIxMTZlOTgzNy1hYzRhLTQ5YzAtYWQ0YS1iNTFjOWZhNGU2Y2EifQ.i8jZFxNKYGDqLrwSxRO_N-XCniznusy7IKxicunoRfQ"}],"nsp":"/"}
api_1           | Fri, 17 Nov 2017 05:52:17 GMT socket.io-parser encoded {"id":2,"type":3,"data":[null,{"accessToken":"eyJhbGciOiJIUzI1NiIsInR5cCI6ImFjY2VzcyJ9.eyJpYXQiOjE1MTA4OTc5MzcsImV4cCI6MTUxMDk4NDMzNywiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDozMDAwIiwiaXNzIjoiZmVhdGhlcnMiLCJzdWIiOiJhbm9ueW1vdXMiLCJqdGkiOiIxMTZlOTgzNy1hYzRhLTQ5YzAtYWQ0YS1iNTFjOWZhNGU2Y2EifQ.i8jZFxNKYGDqLrwSxRO_N-XCniznusy7IKxicunoRfQ"}],"nsp":"/"} as 32[null,{"accessToken":"eyJhbGciOiJIUzI1NiIsInR5cCI6ImFjY2VzcyJ9.eyJpYXQiOjE1MTA4OTc5MzcsImV4cCI6MTUxMDk4NDMzNywiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDozMDAwIiwiaXNzIjoiZmVhdGhlcnMiLCJzdWIiOiJhbm9ueW1vdXMiLCJqdGkiOiIxMTZlOTgzNy1hYzRhLTQ5YzAtYWQ0YS1iNTFjOWZhNGU2Y2EifQ.i8jZFxNKYGDqLrwSxRO_N-XCniznusy7IKxicunoRfQ"}]
api_1           | Fri, 17 Nov 2017 05:52:17 GMT engine:socket sending packet "message" (32[null,{"accessToken":"eyJhbGciOiJIUzI1NiIsInR5cCI6ImFjY2VzcyJ9.eyJpYXQiOjE1MTA4OTc5MzcsImV4cCI6MTUxMDk4NDMzNywiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDozMDAwIiwiaXNzIjoiZmVhdGhlcnMiLCJzdWIiOiJhbm9ueW1vdXMiLCJqdGkiOiIxMTZlOTgzNy1hYzRhLTQ5YzAtYWQ0YS1iNTFjOWZhNGU2Y2EifQ.i8jZFxNKYGDqLrwSxRO_N-XCniznusy7IKxicunoRfQ"}])
api_1           | Fri, 17 Nov 2017 05:52:17 GMT engine:socket flushing buffer to transport
api_1           | Fri, 17 Nov 2017 05:52:17 GMT engine:ws writing "432[null,{"accessToken":"eyJhbGciOiJIUzI1NiIsInR5cCI6ImFjY2VzcyJ9.eyJpYXQiOjE1MTA4OTc5MzcsImV4cCI6MTUxMDk4NDMzNywiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDozMDAwIiwiaXNzIjoiZmVhdGhlcnMiLCJzdWIiOiJhbm9ueW1vdXMiLCJqdGkiOiIxMTZlOTgzNy1hYzRhLTQ5YzAtYWQ0YS1iNTFjOWZhNGU2Y2EifQ.i8jZFxNKYGDqLrwSxRO_N-XCniznusy7IKxicunoRfQ"}]"
api_1           | Fri, 17 Nov 2017 05:52:18 GMT engine:ws received "423["remove","crawls",1,{}]"
api_1           | Fri, 17 Nov 2017 05:52:18 GMT engine:socket packet
api_1           | Fri, 17 Nov 2017 05:52:18 GMT socket.io-parser decoded 23["remove","crawls",1,{}] as {"type":2,"nsp":"/","id":3,"data":["remove","crawls",1,{}]}
api_1           | Fri, 17 Nov 2017 05:52:18 GMT socket.io:socket got packet {"type":2,"nsp":"/","id":3,"data":["remove","crawls",1,{}]}
api_1           | Fri, 17 Nov 2017 05:52:18 GMT socket.io:socket emitting event ["remove","crawls",1,{}]
api_1           | Fri, 17 Nov 2017 05:52:18 GMT socket.io:socket attaching ack callback to event
api_1           | Fri, 17 Nov 2017 05:52:18 GMT socket.io:socket dispatching an event ["remove","crawls",1,{},null]
api_1           | 2017-11-17T05:52:18.003Z @feathersjs/socket-commons Got 'remove' call for service 'crawls'
api_1           | 2017-11-17T05:52:18.003Z @feathersjs/socket-commons Running method 'remove' on service 'crawls' { provider: 'socketio' } [ 1, {}, [Function] ]
api_1           | 2017-11-17T05:52:18.004Z @feathersjs/authentication:hooks:authenticate Attempting to authenticate using jwt strategy with options { name: 'jwt',
api_1           |   bodyKey: 'accessToken',
api_1           |   secret: '067246ba61ff3c2766fdb0a056502854152e6794c82b10404a05e34c7d9b54a9c9788fcfbe08b060ef92e871c42c9751eceb67508f1bcc3d231660fd7dc5e07e0a6c539d7190ab692c299581b4e895a6755809d26b8df648c9f7c714181e118cd2556c61e541757ad22009ede7320de42aae542a6d9130320bbf4a01a2dfa668c181facb172d4ea34cc0825aa72ada6c7f8e9e734053d333a5e61c5c938d7322046bccdc26655fccd81606d8a201be95c59de3e2b3451b9988eb8fa7ada12e343f5725681d2623db9a3c57d7adfdb38eb7405c23cb0d8d199efdd4aca9341797c547506e65c931aa89c51220a400af49d3f98ad52a8dc3baefc2c45574c673f7',
api_1           |   header: 'Authorization',
api_1           |   entity: 'user',
api_1           |   service: 'users',
api_1           |   passReqToCallback: true,
api_1           |   session: false,
api_1           |   jwt:
api_1           |    { header: { typ: 'access' },
api_1           |      audience: 'http://localhost:3000',
api_1           |      subject: 'anonymous',
api_1           |      issuer: 'feathers',
api_1           |      algorithm: 'HS256',
api_1           |      expiresIn: '1d' } }
api_1           | 2017-11-17T05:52:18.005Z @feathersjs/authentication:passport:authenticate Passport request object { query: {},
api_1           |   body: {},
api_1           |   params: { query: {}, route: {}, provider: 'socketio' },
api_1           |   headers: {},
api_1           |   cookies: {},
api_1           |   session: {} }
api_1           | 2017-11-17T05:52:18.005Z @feathersjs/authentication:passport:authenticate Authentication strategy 'jwt' failed Error: No auth token
api_1           |     at JwtStrategy.authenticate (/opt/api/node_modules/passport-jwt/lib/strategy.js:96:26)
api_1           |     at Promise (/opt/api/node_modules/@feathersjs/authentication/lib/passport/authenticate.js:105:18)
api_1           |     at new Promise (<anonymous>)
api_1           |     at /opt/api/node_modules/@feathersjs/authentication/lib/passport/authenticate.js:13:14
api_1           |     at Object.<anonymous> (/opt/api/node_modules/@feathersjs/authentication/lib/hooks/authenticate.js:59:55)
api_1           |     at <anonymous>
api_1           |     at process._tickCallback (internal/process/next_tick.js:188:7) undefined
api_1           | 2017-11-17T05:52:18.006Z @feathersjs/errors NotAuthenticated(401): No auth token
api_1           | 2017-11-17T05:52:18.006Z @feathersjs/errors {}
api_1           | info: error: crawls - Method: remove: No auth token
api_1           | error:  NotAuthenticated: No auth token
api_1           |     at new NotAuthenticated (/opt/api/node_modules/@feathersjs/errors/lib/index.js:88:17)
api_1           |     at app.authenticate.then (/opt/api/node_modules/@feathersjs/authentication/lib/hooks/authenticate.js:76:31)
api_1           |     at <anonymous>
api_1           |     at process._tickCallback (internal/process/next_tick.js:188:7)
api_1           | 2017-11-17T05:52:18.008Z @feathersjs/socket-commons Error in method 'remove' on service 'crawls' { NotAuthenticated: No auth token
api_1           |     at new NotAuthenticated (/opt/api/node_modules/@feathersjs/errors/lib/index.js:88:17)
api_1           |     at app.authenticate.then (/opt/api/node_modules/@feathersjs/authentication/lib/hooks/authenticate.js:76:31)
api_1           |     at <anonymous>
api_1           |     at process._tickCallback (internal/process/next_tick.js:188:7)
@mmucklo

This comment has been minimized.

Copy link
Author

mmucklo commented Nov 17, 2017

@mmucklo

This comment has been minimized.

Copy link
Author

mmucklo commented Nov 17, 2017

Running things on feathersjs 2.0 gives the following output which seems more correct...

api_1           | Fri, 17 Nov 2017 06:17:59 GMT engine:ws writing "433[null,{"accessToken":"eyJhbGciOiJIUzI1NiIsInR5cCI6ImFjY2VzcyJ9.eyJpYXQiOjE1MTA4OTk0MzAsImV4cCI6MTUxMDk4NTgzMCwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDozMDAwIiwiaXNzIjoiZmVhdGhlcnMiLCJzdWIiOiJhbm9ueW1vdXMifQ.tPVLHIcATgGJBBGUtaioNp40ZO4D1HAqI_3RSuPSJqs"}]"
api_1           | Fri, 17 Nov 2017 06:17:59 GMT engine:ws received "424["crawls::remove",2,{}]"
api_1           | Fri, 17 Nov 2017 06:17:59 GMT engine:socket packet
api_1           | Fri, 17 Nov 2017 06:17:59 GMT socket.io-parser decoded 24["crawls::remove",2,{}] as {"type":2,"nsp":"/","id":4,"data":["crawls::remove",2,{}]}
api_1           | Fri, 17 Nov 2017 06:17:59 GMT socket.io:socket got packet {"type":2,"nsp":"/","id":4,"data":["crawls::remove",2,{}]}
api_1           | Fri, 17 Nov 2017 06:17:59 GMT socket.io:socket emitting event ["crawls::remove",2,{}]
api_1           | Fri, 17 Nov 2017 06:17:59 GMT socket.io:socket attaching ack callback to event
api_1           | Fri, 17 Nov 2017 06:17:59 GMT socket.io:socket dispatching an event ["crawls::remove",2,{},null]
api_1           | Fri, 17 Nov 2017 06:17:59 GMT feathers-socket-commons:methods Got 'crawls::remove' event with connection { provider: 'socketio',
api_1           |   user: {},
api_1           |   payload:
api_1           |    { iat: 1510899430,
api_1           |      exp: 1510985830,
api_1           |      aud: 'http://localhost:3000',
api_1           |      iss: 'feathers',
api_1           |      sub: 'anonymous' },
api_1           |   accessToken: 'eyJhbGciOiJIUzI1NiIsInR5cCI6ImFjY2VzcyJ9.eyJpYXQiOjE1MTA4OTk0MzAsImV4cCI6MTUxMDk4NTgzMCwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDozMDAwIiwiaXNzIjoiZmVhdGhlcnMiLCJzdWIiOiJhbm9ueW1vdXMifQ.tPVLHIcATgGJBBGUtaioNp40ZO4D1HAqI_3RSuPSJqs',
api_1           |   headers: { Authorization: 'eyJhbGciOiJIUzI1NiIsInR5cCI6ImFjY2VzcyJ9.eyJpYXQiOjE1MTA4OTk0MzAsImV4cCI6MTUxMDk4NTgzMCwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDozMDAwIiwiaXNzIjoiZmVhdGhlcnMiLCJzdWIiOiJhbm9ueW1vdXMifQ.tPVLHIcATgGJBBGUtaioNp40ZO4D1HAqI_3RSuPSJqs' },
api_1           |   authenticated: true }

My question is then how come I'm seeing this in 3.0:

api_1           | 2017-11-17T05:52:18.005Z @feathersjs/authentication:passport:authenticate Passport request object { query: {},
api_1           |   body: {},
api_1           |   params: { query: {}, route: {}, provider: 'socketio' },
api_1           |   headers: {},
api_1           |   cookies: {},
api_1           |   session: {} }
@mmucklo

This comment has been minimized.

Copy link
Author

mmucklo commented Nov 17, 2017

Update:

Looks like this was user error. In setting things up I had commented out this line of code in authentication.js:

  // The `authentication` service is used to create a JWT.
  // The before `create` hook registers strategies that can be used
  // to create a new valid JWT (e.g. local or oauth2)
  app.service('authentication').hooks({
    before: {
      create: [
        //authentication.hooks.authenticate(config.strategies)
      ],

Removing the '//' in front of authentication.hooks.authenticate made things work.

mmucklo/website-metadata@7b3db39

@mmucklo mmucklo closed this Nov 17, 2017

@mmucklo

This comment has been minimized.

Copy link
Author

mmucklo commented Nov 17, 2017

Now to figure out why socket-io. event listening isn't working after the upgrade, but that's a different concern.

@daffl

This comment has been minimized.

Copy link
Member

daffl commented Nov 17, 2017

Make sure to follow the upgrade guide and initialize the event channels shown in the quick upgrade section.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.