Log in an employee¶
This how-to guides you through the steps required to ensure that only employees authenticated with Entra ID can access your application.
Prerequisites¶
Before you begin, ensure that you have:
- Familiarized yourselves with the login proxy concepts.
- Exposed your application with an ingress.
Configure your application¶
Enable the login proxy for Entra ID in your application configuration:
Login proxy is only available in GCP
Login proxy is only available in GCP clusters, and will not work in on-prem clusters.
See the Nais application reference for the complete specifications with all possible options.
Grant access to users¶
By default, no users have access to your application. You must explicitly grant access to either specific groups, all users, or both.
Groups¶
To only allow access for users that belong to a specific set of groups, you must do two things:
- specify the group identifiers. To find your group's identifier, see finding the group identifier.
- set the
allowAllUsers
property tofalse
spec:
azure:
application:
enabled: true
allowAllUsers: false
claims:
groups:
- id: "<group identifier>"
Entra ID will deny logins and on-behalf-of token requests for users that aren't direct members of the specified groups. Transitive membership through nested groups is not supported.
The groups
claim in JWTs will include matching groups identifiers that the user is a direct member of.
Warning
Invalid group identifiers are skipped and will not be granted access to your application. Ensure that they are correct and exist in Entra ID.
All users¶
To allow all users to access your application, set the allowAllUsers
property to true
:
This is assigns a set of extra groups to the application, which covers all users in the Entra ID tenant.
The groups
claim in JWTs will also include the extra groups that the user is a direct member of.
Groups and all users¶
If you want to implement custom group-based authorization logic in your application, combine the above two configurations:
spec:
azure:
application:
enabled: true
allowAllUsers: true
claims:
groups:
- id: "<group identifier>"
This has the following effects:
- All users are allowed to access your application, i.e. through logins or on-behalf-of token requests.
- The
groups
claim in JWTs will include matching groups identifiers that the user is a direct member of. This also includes the extra groups added by theallowAllUsers
property.
Handle inbound requests¶
Now that your application is configured, you will need to handle inbound requests in your application code.
As long as the user is authenticated, all requests to your application at the server-side will include the Authorization
header with the user's access_token
as a Bearer token.
Your application is responsible for verifying that this token is present and valid. To do so, follow these steps:
Handle missing or empty Authorization
header¶
If the Authorization
header is missing or empty, the employee is unauthenticated.
Return an appropriate HTTP status code to the frontend, and redirect the employee's user agent to the login endpoint:
Validate token in Authorization
header¶
If the Authorization
header is present, validate the JWT Bearer token within.
If invalid, redirect the employee to the login endpoint:
Library for token validation
For JavaScript-based applications, we recommend using navikt/oasis. This provides native utilities for validating tokens as well as exchanging these for new tokens when consuming other APIs.
Otherwise, you can implement validation with the steps below.
The steps below describe how to validate a token using the token introspection endpoint.
What is the token introspection endpoint?
The token introspection endpoint simplifies the token validation process, but does require a network call.
If your application uses a library or framework that supports validering JWTs, you can alternatively let these handle the validation instead. See the reference page for manually validating tokens.
Send a HTTP POST request to the endpoint found in the NAIS_TOKEN_INTROSPECTION_ENDPOINT
environment variable.
The request must have a Content-Type
header set to either:
application/json
orapplication/x-www-form-urlencoded
The body of the request should contain the following parameters:
Parameter | Example Value | Description |
---|---|---|
identity_provider |
azuread |
Always azuread . |
token |
eyJra... |
The access token you wish to validate. |
The response is always a HTTP 200 OK response with a JSON body.
It always contains the active
field, which is a boolean value that indicates whether the token is valid or not.
Success response¶
If the token is valid, the response will additionally contain all the token's claims:
Claims are copied verbatim from the token to the response.
Which claims are validated by the endpoint?
The endpoint only validates the token's signature and its standard claims.
Other claims are included in the response, but are not validated. Your application must validate these other claims according to your own requirements.
Error response¶
If the token is invalid, the only additional field in the response is the error
field:
The error
field contains a human-readable error message that describes why the token is invalid.
Next steps¶
The employee is now authenticated and can access your application.
You can extract the claims from the subject token found in the Authorization
header to assert the user's identity.
However, the token is only valid for your application. To consume other APIs on behalf of the employee, exchange the token for a new token that targets a specific API.
Related pages¶
Learn how to consume other APIs on behalf of a employee