Passport + JWT + Socket.IO 认证

Posted

技术标签:

【中文标题】Passport + JWT + Socket.IO 认证【英文标题】:Passport + JWT + Socket.IO Authentication 【发布时间】:2016-04-24 01:41:32 【问题描述】:

我正在寻找在我的 KOA NodeJS 应用程序中使用 Socket.io 实现 JWT 身份验证的最佳方向。

我在socketio + jwt 上找到了一个很棒的repo,但是作者没有使用passport 也没有使用koa。我想我有一个好的开始,但我想知道 Passport 在这一点上是否有点矫枉过正,因为我使用的是 JWT。下面是我的代码。

Koa.js

import koa from 'koa';
import router from 'koa-router';

import json from 'koa-json';
import bodyParser from 'koa-bodyparser';

import passport from './passport';
import session from './session';
import  config  from './env/env';

export class Koa 

  constructor()
    this.app = koa();
    this.initMiddleware();
  

  initMiddleware()
    this.app.use(json());
    this.app.use(bodyParser());

    this.app.keys = config.secret;
    this.app.use(session);
    this.app.use(passport.initialize());
    this.app.use(passport.session());
  

Session.js

import session from 'koa-generic-session';

// todo: configure for db backed store
export default session();

Passport.js

import passport from 'koa-passport';
import  config  from './env/env';
import  Strategy  from 'passport-jwt';

// todo!
var user =  id: 1, username: 'test' 

passport.serializeUser((user, done) => 
  done(null, user.id)
);

passport.deserializeUser((id, done) => 
  done(null, user)
);

const opts = 
  secretOrKey: config.secret
;

passport.use(new Strategy(opts, (jwt_payload, done) => 
  // User.findOne(id: jwt_payload.sub, function(err, user) 
  if (username === 'test' && password === 'test') 
    done(null, user)
   else 
    done(null, false)
  
));

export default passport;

socketio.js

import io from 'socket.io';
import session from './session';

export class SocketIO 

  constructor(application)
    this.io = io(application.server);

    // authenticate middleware
    this.io.use(function(socket, next)
      // http://***.com/questions/13095418/how-to-use-passport-with-express-and-socket-io
      // http://***.com/questions/26643370/get-user-id-socket-io-passport-koa
      //var sid = cookie.parse(socket.handshake.headers.cookie)['koa.sid'];
      session.apply(socket.request, next);
    );

    this.buildEvents();
  

  buildEvents()
    this.io.on('connection', (socket) => 
      console.log(`new connection: $socket.id`);

      // accessible through a api route
      application.app.socket = socket;

      socket.on('disconnect', () => 
        console.log(`disconnected: $socket.id`);
      );
    );
  

感谢您的帮助。

【问题讨论】:

【参考方案1】:

你可能是对的,护照可能是矫枉过正。也许在 npm 上查看 jsonwebtoken?

然后您可以将.verify() 函数添加到您的身份验证中间件中,并在创建会话时使用 .sign() 来指定用户已通过身份验证。

【讨论】:

我计划最终将 OAuth 添加到我的应用程序中,这就是我仍在犹豫的唯一原因。

以上是关于Passport + JWT + Socket.IO 认证的主要内容,如果未能解决你的问题,请参考以下文章

Passport + JWT + Socket.IO 认证

设置 passport-jwt 身份验证

使用 passport-jwt 验证节点 API

NestJS jwt-passport 身份验证

使用 passport-jwt 进行 JWT 身份验证不考虑到期日期

如何使用 passport-jwt 验证路由?