socket.handshake.query
рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ connect
рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди reconnect
рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд░рд┐рдлреНрд░реЗрд╢ рдЯреЛрдХрди рдХреЗ рд╕рд╛рде рд╕реЙрдХреЗрдЯ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдЕрдзрд┐рдХреГрдд рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдкрд░реЗрд╢рд╛рдиреА рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред
//client
io.connect("wss://socket.server.com", {
query : {
token:"something dynamic"
}
});
рдпрджрд┐ рд╕рд░реНрд╡рд░ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ reconnect
, рддреЛ рд╕реЙрдХреЗрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЕрдзрд┐рдХреГрдд рдХрд░рддреЗ рд╕рдордп рдЯреЛрдХрди рдкреБрд░рд╛рдирд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
//server
io.use(function(socket, next) {
var query = socket.handshake.query;
if(isValidToken(query.token)){
next();//will never fire if the token has been updated
}
});
рдХреНрд╡реЗрд░реА рдХреЛ function
:
io.connect("wss://socket.server.com", {
query : function(){
return {
token:"something dynamic"
}
}
});
рд╡рд░реНрддрдорд╛рди рд╕реЙрдХреЗрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ:
if (opts && opts.query) {
this.query = opts.query;
}
рдЗрд╕рдореЗрдВ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
if(opts && opts.query) {
this.query = typeof opts.query == 'function' && opts.query.call(this) || opts.query;
}
+1
рдмрдЧ #1086 рдХреЗ рд▓рд┐рдП рдлрд┐рдХреНрд╕ рднреА рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рдлрд▓ рдХрдиреЗрдХреНрд╢рди рдХреЗ рдмрд╛рдж рдХреНрд╡реЗрд░реА рд╡рд┐рдХрд▓реНрдк рдмрджрд▓рдирд╛ рдкреБрд░рд╛рдиреЗ рд╕реЙрдХреЗрдЯ.рдЖрдИрдУ-рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдХреНрд╡реЗрд░реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд╕рдВрджрд░реНрдн рдЦреЛ рдЧрдпрд╛ :(
@reeltimedoktor рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЖрдкрдХреЛ query
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ reconnect_attempt
рдИрд╡реЗрдВрдЯ рдкрд░ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
socket.on('reconnect_attempt', function () {
socket.io.opts.query = { token: /* ... */ };
});
@darrachequesne рдХрд╛ рд╕рдорд╛рдзрд╛рди рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ :(
рдореИрдВ рдкрд░ рд╣реВрдБ socket.io-client
рд╕рдВрд╕реНрдХрд░рдг 2.3.0
рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░, рдХреЗ рд╕рд╛рде рдПрдХ рдиреЛрдб рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде socket.io
рд╕рдВрд╕реНрдХрд░рдг 2.3.0
ред
рдЧреНрд░рд╛рд╣рдХ рдкрд░ рдореИрдВ рдпрд╣ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ:
socket.on('reconnect_attempt', async () => {
const newToken = await getNewToken();
socket.io.opts.query = {
token: latestToken,
};
});
рдФрд░ рдлрд┐рд░ рд╕рд░реНрд╡рд░ io.use()
рдХреЛ рдкрд╛рд╕ рдХрд┐рдП рдЧрдП рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреЛрдХрди рдХреЛ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ (рдЬреЛ рд╕реЙрдХреЗрдЯ рдХрдиреЗрдХреНрдЯ рд╣реЛрдиреЗ рдпрд╛ рдлрд┐рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрдиреЗ рдкрд░ рдЖрдЧ рд▓рдЧрдиреА рдЪрд╛рд╣рд┐рдП, afaik?)
рдЗрд╕ рд╕рдордп рд╕рд░реНрд╡рд░ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдкреБрди: рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдХрд╣ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдЯреЛрдХрди рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИ - рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдирдпрд╛ рдЯреЛрдХрди socket.io.opts.query.token
рдХреЛ рдареАрдХ рд╕реЗ рдЕрд╕рд╛рдЗрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ - рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рдХреНрдпреЛрдВ?
рдзрдиреНрдпрд╡рд╛рдж :)
рдЕрджреНрдпрддрди: рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реЙрдХреЗрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд╕реНрдерд╛рдиреЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдСрде рдЯреЛрдХрди рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП socket.io.engine.query.token
, socket.io.engine.transport.query.token
ред рдЬрдм рдЖрдк socket.io.opts.query.token
рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрдиреНрд╣реЗрдВ рдмрджрд▓рдирд╛ рдЕрднреА рднреА рд╕рд░реНрд╡рд░ 'рджреЗрдЦрдиреЗ' рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - рдпрд╣ рдЕрднреА рднреА рдХреЗрд╡рд▓ рдкреБрд░рд╛рдиреЗ рдЯреЛрдХрди рдХреЛ рджреЗрдЦрддрд╛ рд╣реИред
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯреЛрдХрди рдХреЛ рд╕реЙрдХреЗрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреБрдЫ рдпреВрдЖрд░рдПрд▓ рдлрд╝реАрд▓реНрдб рдореЗрдВ рдпреВрдЖрд░рдПрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╢рд╛рдпрдж рдЗрдиреНрд╣реЗрдВ рднреА рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ?
рдЖрдЧреЗ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рдмрд╛рдж, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд░реВрдк рд╕реЗ рдЯреЛрдХрди рдХреА рд╕реНрдерд╛рдкрдирд╛ socket.io.opts.query.token
рдкреБрди: рдХрдиреЗрдХреНрдЯ рдкрд░ рдкреБрди: рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЯреЛрдХрди рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ - рдХреБрдЫ рдФрд░ рд╣реА рдореЗрд░реЗ рдРрдк рдХреЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рд╣реИ, рд╢рд╛рдпрдж firebase рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдЯреЛрдХрди рдкреАрдврд╝реА рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╣реЛ рд░рд╣рд╛ рд╣реИред рддреЛ рдХрд┐рд╕реА рдФрд░ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЗрд╕ рдкрд░ рдЖрддрд╛ рд╣реИ, @darrachequesne рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!
рдареАрдХ рд╣реИ, рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдареАрдХ рдХрд░ рджрд┐рдпрд╛ рд╣реИ - рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдХрд┐ рдЖрдкрдХреЛ 'reconnect_attempt' рдХреЙрд▓рдмреИрдХ рдореЗрдВ рдирдпрд╛ рдЯреЛрдХрди рд╕рдордХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ, рдпрд╛рдиреА рдРрд╕рд╛ рди рдХрд░реЗрдВ:
socket.on('reconnect_attempt', async () => {
const newToken = await getNewToken(); // won't work
socket.io.opts.query = {
token: latestToken,
};
});
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдирдпрд╛ рдЯреЛрдХрди рд╕реЗрдЯ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рдерд╛ред рдпрджрд┐ рдЖрдк рдЯреЛрдХрди рдХреЛ рд╕рдордХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ (рдЗрд╕реЗ рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдХреЗ рдФрд░ рдЗрд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдХреЗ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рд╢реНрд░реЛрддрд╛ рдХреЙрд▓рдмреИрдХ рдореЗрдВ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдХреЗ), рд╕рд░реНрд╡рд░ рдХреЛ рдкреБрди: рдХрдиреЗрдХреНрд╢рди рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╕рдордп рдкрд░ рдирдпрд╛ рдСрде рдЯреЛрдХрди рдорд┐рд▓рддрд╛ рд╣реИред
"socket.io-client": "3.0.4"
рдореБрдЭреЗ TS2341: Property 'opts' is private and only accessible within class 'Manager'.
рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рд╣реИред рдореИрдВ "typescript": "4.1.3"
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ
рдареАрдХ рд╣реИ, рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдареАрдХ рдХрд░ рджрд┐рдпрд╛ рд╣реИ - рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдХрд┐ рдЖрдкрдХреЛ 'reconnect_attempt' рдХреЙрд▓рдмреИрдХ рдореЗрдВ рдирдпрд╛ рдЯреЛрдХрди _рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ, рдпрд╛рдиреА рдРрд╕рд╛ рди рдХрд░реЗрдВ:
socket.on('reconnect_attempt', async () => { const newToken = await getNewToken(); // won't work socket.io.opts.query = { token: latestToken, }; });
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдирдпрд╛ рдЯреЛрдХрди рд╕реЗрдЯ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рдерд╛ред рдпрджрд┐ рдЖрдк рдЯреЛрдХрди рдХреЛ рд╕рдордХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ (рдЗрд╕реЗ рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдХреЗ рдФрд░ рдЗрд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдХреЗ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рд╢реНрд░реЛрддрд╛ рдХреЙрд▓рдмреИрдХ рдореЗрдВ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдХреЗ), рд╕рд░реНрд╡рд░ рдХреЛ рдкреБрди: рдХрдиреЗрдХреНрд╢рди рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╕рдордп рдкрд░ рдирдпрд╛ рдСрде рдЯреЛрдХрди рдорд┐рд▓рддрд╛ рд╣реИред
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рд╡рд░реНрддрдорд╛рди рд╕рдорд╛рдзрд╛рди рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рд╕реЗ disconnect
рд▓рд┐рдП рд╣реИ рдЬрдм рдкреНрд░рдорд╛рдгрди рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ disconnect
рдИрд╡реЗрдВрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдкрд░, рд╣рдо async рдкреНрд░реЙрдорд┐рд╕ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдХреНрд╡реЗрд░реА/рд╣реЗрдбрд░ рдХрд╛ рдкреБрди: рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВред рдЬрдм рддрдХ рдпрд╣ reconnecting
рдИрд╡реЗрдВрдЯ рддрдХ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИ, рддрдм рддрдХ рдХреНрд╡реЗрд░реА/рд╣реЗрдбрд░ рдореЗрдВ рдЗрд╕рдХрд╛ рдирдпрд╛ рдорд╛рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реЛрддрд╛ рд╣реИред
рднрд╡рд┐рд╖реНрдп рдХреЗ рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП:
Socket.IO v2 рдореЗрдВ query
рд╡рд┐рдХрд▓реНрдк рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рджреЛрдиреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
рддреЛ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдкрд┐рдЫрдбрд╝реЗ-рд╕рдВрдЧрдд рддрд░реАрдХреЗ рд╕реЗ рдХреИрд╕реЗ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ...
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ Socket.IO v3 рдореЗрдВ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рдЖрдк auth
рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
// plain object
const socket = io({
auth: {
token: "abc"
}
});
// or with a function
const socket = io({
auth: (cb) => {
cb({
token: "abc"
});
}
});
рдЗрд╕реЗ async
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рднреА рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
const socket = io({
auth: async (cb) => {
cb({
token: "abc"
});
}
});
рдпрд╣ рд╕рднреА рджреЗрдЦреЗрдВ:
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
@reeltimedoktor рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЖрдкрдХреЛ
query
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛreconnect_attempt
рдИрд╡реЗрдВрдЯ рдкрд░ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: