c语言socket鉴权,建立套接字后进行socket.io身份验证
小編典典
這實(shí)際上并不難,但是您正以錯(cuò)誤的方式進(jìn)行處理。幾件事:
您不能使用socket.io 設(shè)置 cookie;但是,您可以隨時(shí)獲取任何已連接客戶(hù)端的cookie值。為了設(shè)置cookie,您將必須發(fā)送一個(gè)新的http響應(yīng),這意味著用戶(hù)必須先發(fā)送一個(gè)新的http請(qǐng)求(又名刷新或轉(zhuǎn)到新頁(yè)面,這聽(tīng)起來(lái)對(duì)您而言不可能)。
是的:socket.io是安全的(只要可以傳輸任何數(shù)據(jù)即可)。
因此,您可以執(zhí)行以下操作:
在用戶(hù)的初始連接上,創(chuàng)建具有唯一會(huì)話ID的cookie,例如從Express的會(huì)話中間件生成的cookie。但是,您將需要配置它們,使其在會(huì)話結(jié)束時(shí)不過(guò)期(否則,它們將在關(guān)閉瀏覽器后立即過(guò)期)。
接下來(lái),您應(yīng)該創(chuàng)建一個(gè)對(duì)象來(lái)存儲(chǔ)cookie會(huì)話ID。每次設(shè)置新的connect.sid
cookie時(shí),都將其默認(rèn)值存儲(chǔ)在新對(duì)象中(這意味著該用戶(hù)已通過(guò)會(huì)話而非登錄進(jìn)行了身份驗(yàn)證)
在用戶(hù)的登錄名上,向服務(wù)器發(fā)送套接字發(fā)出消息,然后您可以在其中驗(yàn)證登錄憑據(jù),然后更新您創(chuàng)建的會(huì)話ID對(duì)象,以使當(dāng)前套接字ID讀為true(登錄)。
現(xiàn)在,當(dāng)接收到新的http請(qǐng)求時(shí),讀取cookie.sid,并檢查其在對(duì)象中的值是否為true。
它看起來(lái)應(yīng)該如下所示:
var express = require('express'),
http = require('http'),
cookie = require('cookie');
var app = express();
var server = http.createServer(app);
var io = require('socket.io').listen(server);
app.use(express.cookieParser());
app.use(express.session({
secret: 'secret_pw',
store: sessionStore,
cookie: {
secure: true,
expires: new Date(Date.now() + 60 * 1000), //setting cookie to not expire on session end
maxAge: 60 * 1000,
key: 'connect.sid'
}
}));
var sessionobj = {}; //This is important; it will contain your connect.sid IDs.
//io.set('authorization'...etc. here to authorize socket connection and ensure legitimacy
app.get("/*", function(req, res, next){
if(sessionobj[req.cookies['connect.sid']]){
if(sessionobj[req.cookies['connect.sid']].login == true){
//Authenticated AND Logged in
}
else{
//authenticated but not logged in
}
}
else{
//not authenticated
}
});
io.sockets.on('connection', function(socket){
sessionobj[cookie.parse(socket.handshake.headers.cookie)['connect.sid'].login = false;
sessionobj[cookie.parse(socket.handshake.headers.cookie)['connect.sid'].socketid = socket.id;
socket.on('login', function(data){
//DB Call, where you authenticate login
//on callback (if login is successful):
sessionobj[cookie.parse(socket.handshake.headers.cookie)['connect.sid']] = true;
});
socket.on('disconnect', function(data){
//any cleanup actions you may want
});
});
2020-07-07
總結(jié)
以上是生活随笔為你收集整理的c语言socket鉴权,建立套接字后进行socket.io身份验证的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: c语言实现文件数据删除视频,如何用c语言
- 下一篇: c语言首尾指针相同 则,6.C语言指针练