如何在nodejs应用程序中验证socket.io连接

tct7dpnv  于 2021-09-13  发布在  Java
关注(0)|答案(1)|浏览(522)

我正在开发一个聊天应用程序,其中套接字用于双向共享消息。
套接字目前工作正常,但我希望能够在用户能够访问套接字连接之前对其进行身份验证。我一直在尝试使用passport,但当我出现错误时,似乎有些事情我做得不对 No session found .

  1. const createError = require("http-errors");
  2. const express = require("express");
  3. const { join } = require("path");
  4. const logger = require("morgan");
  5. const jwt = require("jsonwebtoken");
  6. const cookieParser = require("cookie-parser");
  7. const session = require("express-session");
  8. const SequelizeStore = require("connect-session-sequelize")(session.Store);
  9. const db = require("./db");
  10. const { User } = require("./db/models");
  11. const passport = require('passport');
  12. // create store for sessions to persist in database
  13. const sessionStore = new SequelizeStore({ db });
  14. const http = require("http");
  15. const db = require("../db");
  16. const onlineUsers = require("../onlineUsers");
  17. const passportSocketIo = require('passport.socketio');
  18. const { json, urlencoded } = express;
  19. const app = express();
  20. app.use(logger("dev"));
  21. app.use(json());
  22. app.use(urlencoded({ extended: false }));
  23. app.use(express.static(join(__dirname, "public")));
  24. app.use(cookieParser());
  25. app.use(session({
  26. genid:(req)=>{
  27. return req.cookies
  28. },
  29. secret: process.env.SESSION_SECRET,
  30. resave: true,
  31. store: sessionStore,
  32. saveUninitialized: true,
  33. }));
  34. app.use(function (req, res, next) {
  35. const token = req.cookies["messenger-token"];
  36. if (token) {
  37. jwt.verify(token, process.env.SESSION_SECRET, (err, decoded) => {
  38. if (err) {
  39. return next();
  40. }
  41. User.findOne({
  42. where: { id: decoded.id },
  43. }).then((user) => {
  44. req.user = user;
  45. return next();
  46. });
  47. });
  48. } else {
  49. return next();
  50. }
  51. });
  52. app.use(passport.initialize());
  53. app.use(passport.session());
  54. const port = normalizePort(process.env.PORT || "3001");
  55. app.set("port", port);
  56. /**
  57. * Create HTTP server.
  58. */
  59. const server = http.createServer(app);
  60. /**
  61. * Listen on provided port, on all network interfaces, and sync database.
  62. */
  63. const io = require("socket.io")(server, {
  64. cors: {
  65. origin: "http://localhost:3000",
  66. methods: ["GET", "POST", "PUT"],
  67. credentials: true
  68. }
  69. });
  70. io.use(
  71. passportSocketIo.authorize({
  72. cookieParser: cookieParser,
  73. key: 'messenger-token',
  74. secret: process.env.SESSION_SECRET,
  75. store: sessionStore,
  76. success: onAuthorizeSuccess,
  77. fail: onAuthorizeFail
  78. })
  79. );
  80. function onAuthorizeSuccess(data, accept) {
  81. console.log('successful connection to socket.io');
  82. accept(null, true);
  83. }
  84. function onAuthorizeFail(data, message, error, accept) {
  85. if (error) throw new Error(message);
  86. console.log('failed connection to socket.io:', message);
  87. accept(null, false);
  88. }
  89. io.on("connection", (socket) => {
  90. // console.log(`USER ${JSON.stringify(socket)}`);
  91. socket.on("go-online", (id) => {
  92. if (!onlineUsers.includes(id)) {
  93. onlineUsers.push(id);
  94. }
  95. // send the user who just went online to everyone else who is already online
  96. socket.broadcast.emit("add-online-user", id);
  97. });
  98. socket.on("new-message", (data) => {
  99. socket.broadcast.emit("new-message", {
  100. message: data.message,
  101. sender: data.sender,
  102. });
  103. });
  104. socket.on("read-message", (data) => {
  105. socket.broadcast.emit("read-message", data);
  106. });
  107. socket.on("read-messages", (data) => {
  108. socket.broadcast.emit("read-messages", data);
  109. });
  110. socket.on("logout", (id) => {
  111. if (onlineUsers.includes(id)) {
  112. userIndex = onlineUsers.indexOf(id);
  113. onlineUsers.splice(userIndex, 1);
  114. socket.broadcast.emit("remove-offline-user", id);
  115. }
  116. });
  117. });

如何使用套接字对用户进行身份验证。除了使用passport外,您还可以自由建议其他方法。

pinkon5k

pinkon5k1#

我在github中发现了相同的错误,但尚未解决。
根据官方文档(请参阅“与express中间件的兼容性”一节),您可以在中使用express中间件 io.use 利用 wrap . 本节介绍如何将“快速会话”模块与socket.io一起使用。我想这种方式对你更好,因为你已经在使用它了。

相关问题