簡體   English   中英

將 Websocket 與 Passport 結合使用

[英]Using Websocket with Passport

當有人打開 WebSocket 連接時,如何訪問當前會話的通行證登錄名?

我發現了一個不錯的項目express-ws ,它似乎工作得很好

app.ws('/', function(ws, req) {
    ws.on('message', function(msg) {
        console.log('express-ws --- ', msg);
    });
    console.log('socket', req.user); //current user == req.user
});

但是我將如何通過普通的 Websocket 連接獲取相同的信息?

var WebSocketServer = require('ws').Server,
    wss = new WebSocketServer({ port: 3001 });

wss.on('connection', function(socket){
    //Where is the current user????
    console.log('connection');

    socket.on('message', function(message){
        console.log('message received', message);
    });
});

(這第二個連接確實工作得很好 - 但我一生都找不到任何方法從 Passport 獲取登錄信息)

在創建 WS 服務器時,添加一個“verifyClient”參數如下以獲取會話信息:

  const wss = new (require('ws').Server)({
    server,
    verifyClient: (info, done) => {
      sessionParser(info.req, {}, () => {
        done(info.req.session)
      })
    }
  })

其中sessionParser是您的express-session配置對象。 這允許您通過req.session在 websocket 中訪問它。 如果您使用的是護照,您可能需要req.session.passport.user ..

可以使用ws.upgradeReq.session.passport.user而不是使用req.session.passport.user來訪問經過身份驗證的用戶 ID。

app.ws('/', function(ws, req) {
    ws.on('message', function(msg) {
        console.log('express-ws --- ', msg);
    });
    console.log(ws.upgradeReq.session.passport.user);
    /* keys can be found like
    for(var key in ws.upgradeReq.session.passport){
        console.log(key);
    }
    */
});

也許不是最好的解決方案,但我們可以使用以下代碼刪除 WS 連接:


const wss = new webSocket.Server({ server, port: 9999})

wss.on('connection', (ws, req) => {

  // get token from url:  ..url..?token=your_JWT_TOKEN
  const params = require('url').parse(req.url, true).query
  const { token } = params

  // add token to headers (could be done on frontend)
  req.headers.authorization = `Bearer ${token}`

  // look for the user with token
  passport.authenticate(
    'jwt',
    {
      session: false
    },
    (err, user, info) => {
      // If no user close websocket
      if (!user) {
        console.log('Websocket disconnected due to invalid token')
        ws.close()
      }
    }
  )(req)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM