✦ Oplossingen · HTTP-foutcodes

401 Unauthorized: inloggen vereist of mislukt

Krijg je 401 Unauthorized of ‘Authorization Required’? De server weet niet wie je bent. Lees het verschil met 403 en los basic auth- en API-tokenproblemen stap voor stap op.

Zo ziet de foutmelding eruit

  • 401 Unauthorized
  • 401 Authorization Required
  • HTTP ERROR 401
  • This server could not verify that you are authorized to access the document requested.
  • Unauthorized

Waarom gebeurt dit?

Een 401 Unauthorized betekent ondanks de naam: niet geauthenticeerd. De server weet niet wie je bent, omdat je geen inloggegevens meestuurde of omdat die niet kloppen. Hij hoort er een header WWW-Authenticate bij te sturen die zegt hoe je je moet aanmelden, bijvoorbeeld Basic (gebruikersnaam en wachtwoord) of Bearer (een token).

Bij websites zie je 401 vooral bij basic auth: de browser toont een klein inlogvenster van de server zelf, niet een inlogpagina van de website. Dit wordt vaak gebruikt om een testomgeving of beheermap af te schermen. Klik je dat venster weg of typ je verkeerde gegevens, dan volgt de 401.

Bij API’s en apps betekent 401 meestal dat het token ontbreekt, verkeerd is meegegeven of is verlopen. Ook een proxy of webserver die de Authorization-header onderweg weggooit, geeft precies hetzelfde resultaat: de applicatie ziet geen inloggegevens en antwoordt met 401.

Zo herken je dit probleem

  • De browser toont een eigen inlogvenster (geen pagina van de site) en na annuleren volgt 401.
  • Je bent wel ingelogd, maar krijgt geen toegang tot een pagina: dan is het eerder 403 Forbidden.
  • Een koppeling of app werkte eerst wel en geeft nu ineens 401: denk aan een verlopen token of gewijzigd wachtwoord.
  • Blijft Outlook om je wachtwoord vragen, dan is dat een ander probleem: zie Outlook blijft om wachtwoord vragen.

Zo los je het op, stap voor stap

Menunamen kunnen per versie of toestel iets anders heten. Loop de stappen op volgorde af en stop zodra het werkt.

  1. Log opnieuw in met de juiste gegevens

    Controleer gebruikersnaam en wachtwoord, ook op hoofdletters en een eventueel ingeschakelde Caps Lock. Bij basic auth zijn dat de gegevens van de afgeschermde map, niet je gewone account op de website. Vraag ze na bij wie de site of testomgeving beheert.

  2. Wis opgeslagen inloggegevens

    Browsers onthouden basic-auth-gegevens tot je de browser helemaal afsluit. Typte je eerder een fout wachtwoord, sluit dan alle vensters en probeer opnieuw, of test in een privévenster. Bij een website met eigen inlogpagina helpt het om de cookies van die site te wissen en opnieuw in te loggen.

  3. Controleer het token of de API-sleutel

    Krijgt een koppeling 401, kijk dan of de sleutel of het token nog geldig is en of het in de juiste header staat. Veel API’s verwachten Authorization: Bearer <token>. Tokens hebben vaak een korte geldigheid; je app moet dan met een refresh-token een nieuw token ophalen. Ook een verkeerde systeemklok kan een token ongeldig laten lijken.

    curl -si https://api.voorbeeld.nl/v1/me \
      -H "Authorization: Bearer $TOKEN"
  4. Kijk wat de server terugstuurt

    De header WWW-Authenticate vertelt welke methode de server verwacht. Bij een verlopen of ongeldig token sturen veel API’s daar een extra toelichting in mee, zoals error="invalid_token".

    curl -si https://www.voorbeeld.nl/beheer/ | grep -i -E '^(HTTP|www-authenticate)'
  5. Beheerder: controleer de basic-auth-instelling

    Bij nginx staan auth_basic en auth_basic_user_file in het server- of locationblok. Bij Apache gebruik je AuthType, AuthUserFile en Require valid-user. Het pad naar het wachtwoordbestand moet absoluut zijn en leesbaar voor de webserver. Met htpasswd (uit apache2-utils) maak of wijzig je gebruikers.

    # nginx
    location /beheer/ {
        auth_basic "Afgeschermd";
        auth_basic_user_file /etc/nginx/.htpasswd;
    }
    
    # Apache (.htaccess of serverconfiguratie)
    AuthType Basic
    AuthName "Afgeschermd"
    AuthUserFile /var/www/.htpasswd
    Require valid-user
    
    # gebruiker toevoegen (zonder -c, anders wordt het bestand overschreven)
    sudo htpasswd /etc/nginx/.htpasswd gebruikersnaam
  6. Beheerder: controleer of de Authorization-header aankomt

    Draait PHP via FastCGI achter Apache, dan wordt de Authorization-header standaard niet altijd doorgegeven aan PHP. De applicatie ziet dan geen token en geeft 401, terwijl de aanvraag goed was. Met CGIPassAuth On of een rewrite-regel geef je de header door. Zit er een proxy of load balancer voor, controleer dan ook of die de header niet verwijdert.

    # Apache, in .htaccess of de vhost
    CGIPassAuth On
    
    # alternatief met mod_rewrite
    RewriteEngine On
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
  7. Ontwikkelaar: kies tussen 401 en 403

    Geef 401 als iemand niet of verkeerd is aangemeld, en stuur er een WWW-Authenticate-header bij. Geef 403 als de gebruiker wel bekend is, maar geen recht heeft op deze actie. Een duidelijke foutmelding in de body helpt de aanroeper: ‘token verlopen’ is iets anders dan ‘geen toegang tot dit project’.

Let op: Gebruik basic auth alleen via https. Bij http gaan gebruikersnaam en wachtwoord zonder versleuteling over het netwerk; base64 is geen beveiliging.

Het verschil tussen 401 en 403

De twee worden vaak door elkaar gebruikt, maar ze betekenen iets anders:

  • 401: ‘wie ben jij?’ Er ontbreken inloggegevens of ze kloppen niet. Opnieuw inloggen kan het oplossen.
  • 403: ‘ik weet wie je bent, maar dit mag je niet.’ Opnieuw inloggen met hetzelfde account helpt niet; er moeten rechten veranderen.
  • Sommige websites geven bewust 404 in plaats van 403, zodat niet zichtbaar is dat een pagina bestaat.

Wanneer schakel je hulp in?

  • Je bent zelf beheerder, maar je afgeschermde map of testomgeving laat niemand meer binnen.
  • Een koppeling met een boekhoud-, betaal- of mailsysteem geeft 401 en tokens vernieuwen helpt niet.
  • De API werkt lokaal wel maar op de server niet: vaak gaat de Authorization-header onderweg verloren.
  • Je vermoedt dat inloggegevens zijn uitgelekt en wilt ze veilig vervangen.

Lukt het niet? Wij helpen

Kom je er met deze stappen niet uit, of wil je het liever niet zelf doen? We kijken online mee of komen langs. Hulp op afstand kost €20 per uur; komen we langs, dan is de prijs op aanvraag. Je weet vooraf waar je aan toe bent.

Aanvraag

Hulp aanvragen

Schrijf kort wat er misgaat en wat je al hebt geprobeerd. Kies of we bellen, online meekijken of langskomen.

Veelgestelde vragen

Vragen over dit probleem

Wat is het verschil tussen 401 en 403?

Bij 401 weet de server niet wie je bent: inloggen ontbreekt of mislukt. Bij 403 weet hij het wel, maar heb je geen toestemming.

Waarom blijft de browser het inlogvenster tonen?

De gebruikersnaam of het wachtwoord klopt niet, of de server kan het wachtwoordbestand niet lezen. Controleer de gegevens en, als beheerder, het pad en de rechten van het .htpasswd-bestand.

Mijn API-koppeling geeft ineens 401, wat nu?

Controleer of het token of de API-sleutel is verlopen of ingetrokken, en of hij in de juiste header wordt meegestuurd. Maak zo nodig een nieuwe sleutel aan in het systeem waarmee je koppelt.

Kan ik basic auth gebruiken om een testsite af te schermen?

Ja, dat is daar geschikt voor, mits de site via https bereikbaar is. Het houdt ook zoekmachines buiten.