thêm socket io vào website có query param - yếu tố xác thực jwt

thêm socket io vào website có query param - yếu tố xác thực jwt

2021-07-14 828 lượt xem

Package cần thiết

npm i jsonwebtoken --save 
npm i dotenv --save

Server nodejs

// Add your socket.io logic here!
io
.use(async (socket, next) => {
    console.log('middleware running...');

    const { query } = socket.handshake
    const { token } = query
    if (!token){
        
        let err  = new Error('Authentication error')
        err.code = 401
        err.type = 'token'
        err.message = 'Authentication error'
        return next(err)
    }
    const auth = await authMiddleware.isAuthSocket(token)
    if( !auth ){
        
        let err  = new Error('Authentication error')
        err.code = 403
        err.type = 'auth_error'
        err.message = 'Authentication error'
        return next(err)
    }
    socket.jwt = auth
    next();
})
.on( "connection", socket => {

    console.log("have connect: " + socket.id, socket.jwt )
        
    socket.on( 'disconnect', async function () {

        console.log( "disconnect set user offline")
        socket.leaveAll()
    })
});
// end of socket.io logic

Mình có dùng 1 hàm là isAuthScket thì hàm này để giải mã jwt dùng thư viện jsonwebtoken bình thường như app đang dùng thôi. 

require('dotenv').config()
const jwt    = require('jsonwebtoken')
const secret = process.env.JWT_SECRET || 'jsonwebtoken-secret' // mình có dùng dotenv 

/**
 * Middleware: Authorization user by token jwt in socket
 * @param {*} req 
 * @param {*} res 
 * @param {*} next 
 */
let isAuthSocket = async token => {

    try {

        return await jwt.verify( token, secret )
    } catch (error) {
        console.log("=======================================")
        console.log("=======================================")
        console.log("======== socket error auth ============")
        console.log("=======================================")
        console.log("=======================================")
        return false
    }
}
module.exports = {
    isAuthSocket,
}

Ở client trong html

<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.4/socket.io.js"></script>
    <script>
        const jwt = '{{ Cookie::get(Config::get('constant.TOKEN_COOKIE_NAME')) }}';
        const socket = io.connect('http://localhost:3000', {
            query: 'token=' + jwt
        });
        console.log("connected ở đây không thành công đâu " + socket.connected);
        socket.on('connect', function() {
            console.log("Successfully connected!");
            if(socket.connected){
                console.log("connected ở đây sẽ thành công " + socket.connected);
            }
        })
        .on('error', function(error) {
            console.log(error)
        })
    </script> 

Kết quả

những tag
bài viết trong chủ đề