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ả