Autentisering og autorisasjon
Integrer autentiseringsmekanismer (for eksempel JWT) under håndtrykket, og administrer brukertillatelser for WebSocket-meldinger.
Autentisering og autorisasjon er en gratis leksjon i Programmering av WebSockets og sanntidssystemer på CoddyKit. Dette er leksjon 2 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Programmering av WebSockets og sanntidssystemer, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Programmering av WebSockets og sanntidssystemer inneholder totalt 4 leksjoner.
Sikring av WebSocket-kommunikasjon
WebSockets muliggjør effektiv kommunikasjon i sanntid. Men akkurat som ved all annen webkommunikasjon må vi vite hvem som kobler til, og hva de har lov til å gjøre.
Det er her autentisering og autorisasjon kommer inn. De er avgjørende for å bygge sikre og pålitelige applikasjoner.
Autentiseringsutfordringer for WebSockets
I motsetning til tradisjonelle HTTP-forespørsler, som er tilstandsløse og ofte inneholder autentiseringshoder i hver forespørsel, oppretter WebSockets en vedvarende, tilstandsbasert tilkobling.
Det betyr at vi autentiserer én gang under det innledende tilkoblingshåndtrykket, og at serveren deretter må huske klientens identitet så lenge tilkoblingen varer.
Autentisering under håndtrykket
Det beste tidspunktet for å autentisere en klient er under WebSocket-håndtrykket. Dette er den innledende HTTP-forespørselen som oppgraderes til en WebSocket-tilkobling.
- Klienten sender en HTTP GET-forespørsel med et
Upgrade: websocket-hode. - Serveren kan kontrollere denne forespørselen for autentiseringsopplysninger før den avgjør om tilkoblingen skal oppgraderes.
- Hvis opplysningene er gyldige, opprettes tilkoblingen; ellers avvises den.
Sende legitimasjon: spørringsparametere
En måte å sende legitimasjon på er via spørringsparametere i WebSocket-URL-en. Eksempel: ws://server.com/chat?token=your_jwt.
- Fordeler: Enkelt å implementere.
- Ulemper: Kan eksponere sensitive tokenverdier i serverlogger eller nettleserloggen. Generelt mindre sikkert og ikke anbefalt i produksjon.
Sende legitimasjon: HTTP-hoder
En sikrere og anbefalt metode er å sende autentiseringstokener i HTTP-hoder under håndtrykket.
Det standardiserte WebSocket-API-et støtter ikke egendefinerte hoder direkte, men enkelte biblioteker eller proxy-konfigurasjoner tillater dette. Ofte brukes egendefinerte hoder som Authorization: Bearer your_jwt, eller tokenverdier bygges inn i Sec-WebSocket-Protocol-hodet.
Hva er et JSON Web Token (JWT)?
Et JSON Web Token (JWT) er en kompakt og URL-sikker måte å representere krav som skal overføres mellom to parter på. Det brukes ofte til autentisering.
- Det er digitalt signert, noe som sikrer ektheten.
- Det inneholder brukerinformasjon (for eksempel bruker-ID og roller) i en nyttelast.
- Serveren verifiserer JWT-signaturen for å bekrefte brukerens identitet.
JWT-håndtrykk på serversiden (Node.js)
Her er et forenklet Node.js-eksempel som bruker ws-biblioteket, og som viser hvordan en server kan verifisere et JWT fra en spørringsparameter under håndtrykket. I en ekte applikasjon bør De bruke et robust JWT-bibliotek.
const WebSocket = require('ws');
const url = require('url');
const wss = new WebSocket.Server({ noServer: true });
wss.on('connection', function connection(ws, request) {
const userId = request.userId; // Set during handshake verification
console.log(`Client ${userId} connected`);
ws.on('message', function incoming(message) {
console.log(`Received from ${userId}: ${message}`);
});
ws.on('close', () => console.log(`Client ${userId} disconnected`));
});
// This is where you would integrate with an HTTP server
// For simplicity, we'll simulate the handshake here.
// Simulate an HTTP server upgrade listener
// In a real app, this would be an http.Server.on('upgrade')
function handleUpgrade(request, socket, head) {
const pathname = url.parse(request.url).pathname;
if (pathname === '/ws') {
const token = new URLSearchParams(url.parse(request.url).query).get('token');
// --- Simulate JWT verification ---
if (token === 'valid_jwt_123') {
request.userId = 'user_1'; // Attach user info to request
wss.handleUpgrade(request, socket, head, function done(ws) {
wss.emit('connection', ws, request);
});
} else {
console.log('Invalid JWT. Connection rejected.');
socket.destroy();
}
} else {
socket.destroy();
}
}
// Example usage (not a full http server, just for demonstration)
const mockRequest = {
url: '/ws?token=valid_jwt_123',
headers: { 'upgrade': 'websocket', 'connection': 'upgrade' }
};
const mockSocket = {
destroy: () => console.log('Socket destroyed (connection rejected)')
};
const mockHead = Buffer.alloc(0);
console.log('Attempting connection with valid token...');
handleUpgrade(mockRequest, mockSocket, mockHead);
// Attempt connection with invalid token
const mockInvalidRequest = {
url: '/ws?token=invalid_jwt',
headers: { 'upgrade': 'websocket', 'connection': 'upgrade' }
};
const mockInvalidSocket = {
destroy: () => console.log('Socket destroyed (connection rejected)')
};
console.log('\nAttempting connection with invalid token...');
handleUpgrade(mockInvalidRequest, mockInvalidSocket, mockHead);Autorisasjon: Hvem kan gjøre hva?
Når en bruker er autentisert (vi vet hvem brukeren er), avgjør autorisasjon hvilke handlinger brukeren har tillatelse til å utføre.
Dette innebærer ofte å kontrollere brukerroller eller tillatelser som er knyttet til den autentiserte identiteten. En bruker med rollen «guest» kan for eksempel kanskje bare lese meldinger, mens en «admin» også kan slette dem.
Autorisasjon på meldingsnivå (Node.js)
Etter at en WebSocket-tilkobling er opprettet og brukeren er autentisert, kan serveren håndheve autorisasjonsregler for innkommende meldinger. Dette eksempelet viser en enkel kontroll basert på brukerens rolle.
const WebSocket = require('ws');
// Simulate a WebSocket server for demonstration
const wss = new WebSocket.Server({ port: 8080 });
// In a real application, user info (like roles) would be
// stored in the ws object after successful authentication.
const connectedClients = new Map(); // Map ws -> { userId, role }
wss.on('connection', function connection(ws) {
// Simulate authenticated user and their role
const userId = `user_${Math.floor(Math.random() * 100)}`;
const role = (userId === 'user_10') ? 'admin' : 'member';
connectedClients.set(ws, { userId, role });
console.log(`Client ${userId} (${role}) connected.`);
ws.send(`Welcome, ${userId}! Your role is ${role}.`);
ws.on('message', function incoming(message) {
const clientInfo = connectedClients.get(ws);
const msg = message.toString();
console.log(`Received from ${clientInfo.userId}: ${msg}`);
// --- Authorization Check ---
if (msg.startsWith('/delete') && clientInfo.role !== 'admin') {
ws.send('Error: You are not authorized to delete messages.');
console.log(`${clientInfo.userId} (member) tried to delete.`);
} else if (msg.startsWith('/delete') && clientInfo.role === 'admin') {
ws.send('Message deleted successfully!');
console.log(`${clientInfo.userId} (admin) deleted a message.`);
// In a real app, delete logic would go here
} else {
// Broadcast message to others or process normally
wss.clients.forEach(function each(client) {
if (client !== ws && client.readyState === WebSocket.OPEN) {
client.send(`${clientInfo.userId}: ${msg}`);
}
});
ws.send(`You said: ${msg}`);
}
});
ws.on('close', () => {
const clientInfo = connectedClients.get(ws);
console.log(`Client ${clientInfo.userId} disconnected.`);
connectedClients.delete(ws);
});
});
console.log('WebSocket server started on port 8080. Try connecting with a WebSocket client!');
console.log('Simulated user_10 is an admin, others are members.');Hurtigsjekk av autentisering og autorisasjon
Når er det mest hensiktsmessige og sikre tidspunktet for å autentisere en klient i en WebSocket-tilkobling?
Oppsummering: Sikre tilkoblinger
Vi har utforsket hvordan WebSocket-tilkoblinger kan sikres ved å implementere autentisering og autorisasjon.
- Autentisering skjer hovedsakelig under håndtrykket, ofte ved hjelp av JWT-er som sendes i hoder.
- Autorisasjon avgjør brukerens tillatelser og styrer hvilke handlinger brukeren kan utføre over den etablerte tilkoblingen.
- Disse mekanismene er avgjørende for å beskytte sanntidsapplikasjonene Deres mot uautorisert tilgang og uautoriserte handlinger.
Lær deg Programmering av WebSockets og sanntidssystemer med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 12
- Leksjoner
- 47
Ofte stilte spørsmål
Er leksjonen «Autentisering og autorisasjon» gratis?
Ja – hele teksten i «Autentisering og autorisasjon» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Programmering av WebSockets og sanntidssystemer-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Programmering av WebSockets og sanntidssystemer inneholder totalt 4 leksjoner.
Hva lærer jeg i «Autentisering og autorisasjon»?
Integrer autentiseringsmekanismer (for eksempel JWT) under håndtrykket, og administrer brukertillatelser for WebSocket-meldinger. Du øver på Programmering av WebSockets og sanntidssystemer med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Programmering av WebSockets og sanntidssystemer?
Ingen tidligere erfaring er nødvendig. Programmering av WebSockets og sanntidssystemer på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.
Hvor lang tid tar leksjonen «Autentisering og autorisasjon»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Programmering av WebSockets og sanntidssystemer-leksjonen?
Ja. Alle Programmering av WebSockets og sanntidssystemer-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- WebSocket Secure (WSS) og TLS
- Autentisering og autorisasjon
- Forebygging av vanlige WebSocket-angrep
- Ratebegrensning og forebygging av misbruk